8

看了几个例子后,我不得不说,我没看懂 F-Bounded 多态带来了什么。

使用 scala 学校的示例 ( https://twitter.github.io/scala_school/advanced-types.html#fbounded )

他们解释说他们需要一些 F-Bounded 类型,以便子类可以返回子类型。所以他们做了这样的事情:

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
}

任何解释都非常受欢迎

谢谢

4

2 回答 2

5

当它看起来像这样时,优势就会出现:

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免费获得,并且您获得了正确的返回类型。如果没有这样的东西,您必须手动覆盖每个返回相同类型的方法(许多毫无意义的样板文件),否则一旦调用非覆盖方法,您就会失去类型的特异性。

于 2015-03-30T07:07:47.883 回答
1

在 Scala 中,您可以使您的类型参数受类型绑定的约束。在您的第一个方法中,您正在使您的类型参数与 Container 的子类一起设置上限。

通过使用您的第一种方法,您不能在 Container 类中传递参数,该类不是您的 Container 类的子类。

在您的第二个示例中,您可以传递任何类的参数类型实例。所以在这里你没有限制任何东西,而在第一个例子中你限制了 Container 类的类型子类型。

于 2015-03-30T07:48:44.447 回答