Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 自引用泛型_Scala - Fatal编程技术网

Scala 自引用泛型

Scala 自引用泛型,scala,Scala,我四处搜索了一下,但找不到这种结构的示例: Person[P <: Person[P]] Person[P该结构本身在中有解释,称为F-有界多态性 // you define it like this trait X extends Person[X] // it then gets expanded to this trait Person[X extends Person[X]] 当特征需要引用其扩展对象的类型时,使用此结构。如果Scala学派的解释不够,您可以在internet

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

Person[P <: Person[P]]

Person[P

该结构本身在中有解释,称为F-有界多态性

// you define it like this
trait X extends Person[X]

// it then gets expanded to this
trait Person[X extends Person[X]]

当特征需要引用其扩展对象的类型时,使用此结构。如果Scala学派的解释不够,您可以在internet上搜索“F-有界多态性”

这有时被称为自类型(不要与Scala明确类型的自引用混淆)它通常用于具有足够强的方法签名,以表示该方法使用与接收方相同类型的对象

让我们看一个例子。比如说,你有一个基本特征
动物
,带有一个通用的
品种
方法,它接受另一个
动物
,并返回一个
动物

trait Animal {
  def breed(a: Animal): Animal
}
好的,但实际上您需要的是一个
bride
方法,它表示每个具体的动物只与同一类的动物一起繁殖,并且还返回同一类的动物

class Cow extends Animal {
  def breed(c: Cow) = new Cow
}
不可能,因为此
品种的签名不匹配。也不可能重写,因为您需要协变地更改参数类型,这是禁止的

自救类型:

trait Animal[A <: Animal[A]] {
  def breed(a: A): A
}

class Cow extends Animal[Cow] {
  def breed(c: Cow) = new Cow
}

trait动物[一个F-有界多态性…是的,我永远也找不到。谢谢,我想我现在明白了。在最后一行中,你的
扩展了
,你是说
我一直在跳来跳去选择这两个中的一个。你认为
感谢这个例子,以及我认为我现在真正理解的来自EECOLOR的链接吗这对我面前的代码有什么好处^^