我搜索了一下,但找不到这种结构的示例:
Person[P <: Person[P]]
这是以我理解的方式解释的。
这是如何解决的?对我来说,这有点像无休止的递归,但似乎我对这个结论有误。
我搜索了一下,但找不到这种结构的示例:
Person[P <: Person[P]]
这是以我理解的方式解释的。
这是如何解决的?对我来说,这有点像无休止的递归,但似乎我对这个结论有误。
该结构本身在Twitter Scala School中进行了解释,称为 F 有界多态性。
// you define it like this
trait X extends Person[X]
// it then gets expanded to this
trait Person[X extends Person[X]]
当 trait 需要引用它正在扩展的对象的类型时,使用此结构。如果 Scala 学校的解释还不够,您可以在互联网上搜索“F-bounded polymorphism”
这有时被称为自类型(不要与 Scala 的显式类型自引用混淆),它通常用于具有足够强大的方法签名,以表示该方法可以与与接收者具有相同类型的对象一起使用.
让我们看一个例子。比如说,你有一个Animal
带有泛型breed
方法的基本特征,它接受另一个Animal
并返回一个Animal
.
trait Animal {
def breed(a: Animal): Animal
}
好的,但是您真正想要的是一种breed
方法,该方法表示每个具体的动物只与同一类的动物繁殖,并且还返回同一类的动物。下面的实现
class Cow extends Animal {
def breed(c: Cow) = new Cow
}
不可能,因为 thisbreed
的签名不匹配。覆盖也是不可能的,因为您需要协变地更改参数类型,这是被禁止的。
自我类型的救援:
trait Animal[A <: Animal[A]] {
def breed(a: A): A
}
class Cow extends Animal[Cow] {
def breed(c: Cow) = new Cow
}
正如 EECOLOR 已经指出的那样,其背后的类型论称为F-bounded polymorphism。