经过几个例子后,我不得不说,我不明白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
}
非常欢迎任何解释
由于
答案 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类的子类型。