在看了几个例子之后,我不得不说,我不明白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,并获得正确的返回类型。没有这样的事情,您必须手动覆盖返回相同类型的每个单个方法(很多无意义的样板),否则,一旦调用非覆盖方法,您就失去类型的特异性。

10-06 08:30