在看了几个例子之后,我不得不说,我不明白F界多态带来了什么。
使用scala学校(https://twitter.github.io/scala_school/advanced-types.html#fbounded)中的示例
他们解释说,他们需要某种F边界类型,以便子类可以返回该子类型。
所以他们做了这样的事情:
trait Container[A <: Container[A]] extends Ordered[A]
class MyContainer extends Container[MyContainer] {
def compare(that: MyContainer) = 0
}
但是当您可以使用以下类型的东西时,我看不出使用这种类型有什么好处:
trait Container[A] extends Ordered[A]
class MyContainer extends Container[MyContainer] {
def compare(other: MyContainer) = 0
}
任何解释都非常欢迎
谢谢
最佳答案
当它看起来像这样时,优势就会显现出来:
trait Container[A <: Container[A]] extends Ordered[A] {
def clone: A
def pair: (A, A) = (clone, clone)
}
class MyContainer extends Container[MyContainer] {
def clone = new MyContainer
}
现在,您可以免费获得
pair
,并获得正确的返回类型。没有这样的事情,您必须手动覆盖返回相同类型的每个单个方法(很多无意义的样板),否则,一旦调用非覆盖方法,您就失去类型的特异性。