Scala 类型参数重复

标签 scala types

在 Scala 中,您可以定义从其他参数下降的参数,这些参数将第一个作为参数。例如在 Lift 中,您可以在 Record 和 Mapper 中找到此类内容

MongoMetaRecord[BaseRecord <: MongoRecord[BaseRecord]]

这是什么意思,这有什么用?

最佳答案

这是一种经常用于让抽象类知道扩展它的实际具体类的类型的模式。有时知道最终的具体类型是什么很有用——例如,将它用作生成当前对象副本的方法的返回类型。

假设你想这样做——让一个抽象类Abstract了解实现它的具体类型。您可以从定义一个类型参数开始,可能是这样的:

trait Abstract[A] {
  def copyObject: A = ...
}

但后来你意识到,实际上,A应该是 Abstract 的子类本身,因为您不希望子类提供随机参数化。所以你可以添加这个:
trait Abstract[A <: Abstract]

... 但你很快就会意识到 Abstract也变成了泛型类型,所以你更需要这个:
trait Abstract[A <: Abstract[A]]

作为最后一步,您可能想要制作 A如果可以,协变,以便允许沿来自 Abstract 的继承路径的中间抽象类到最后的具体类:
trait Abstract[+A <: Abstract[A]]
class Concrete1 extends Abstract[Concrete1]

trait RefinedAbstract[+A <: RefinedAbstract[A]] extends Abstract[A]
class Concrete2 extends RefinedAbstract[Concrete2]

这意味着每个非叶(抽象)类型都应该被参数化,并且只有最终的具体类才能删除类型参数。

关于Scala 类型参数重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9680731/

相关文章:

scala:类型被推断为 `Any` ;这可能表明存在编程错误

java - 类型类的工厂方法需要 Scala 设计建议

haskell - 声明类型类的列表实例

haskell - 在 monad 转换器中使用类型同义词

javascript - 列类型的 Cassandra 代码?

用于 Play 的 Json "Validate"

mysql - Joda-Date Mapper for Slick - MappedColumnTyoe

c++ - 为什么使用 _Bool 和 bool 而不是 int8_t 或 char?

Eclipse、Scala 和 Maven - 未生成类文件

javascript - Twig - JavaScript bool 值