5

我搜索了一下,但找不到这种结构的示例:

Person[P <: Person[P]]

这是以我理解的方式解释的。

这是如何解决的?对我来说,这有点像无休止的递归,但似乎我对这个结论有误。

4

2 回答 2

5

该结构本身在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”

于 2013-02-18T16:02:06.227 回答
5

这有时被称为自类型(不要与 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

于 2013-02-18T16:11:05.053 回答