scala f-bound类型解释

时间:2015-03-30 06:19:48

标签: scala types polymorphism f-bounded-polymorphism

经过几个例子后,我不得不说,我不明白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
}

非常欢迎任何解释

由于

2 个答案:

答案 0 :(得分:4)

当它看起来像这样时会有好处:

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

答案 1 :(得分:1)

在Scala中,您可以使类型参数受到类型绑定的约束。在您的第一个方法中,您将使类型参数与Container的子类进行上限。

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

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

相关问题