【问题标题】:scala f-bounded types explanationscala f 有界类型解释
【发布时间】:2015-06-03 01:48:23
【问题描述】:

看了几个例子之后,不得不说,我没看懂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
}

非常欢迎任何解释

谢谢

【问题讨论】:

    标签: scala types polymorphism f-bounded-polymorphism


    【解决方案1】:

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

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

    【讨论】:

    • 我想我明白了尼山的观点,对我来说这是有道理的,但你所说的部分是让我感到困惑的部分。从您的示例中,您可以像这样定义 A: trait Container[A] 并获得相同的结果。您不必覆盖 sublcas 中的 pair 函数
    • 哦,没关系,我刚刚知道了。如果你做 trait Container[A],你不能保证从子类中返回的类型 A 是 Container 类型。非常感谢
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-22
      • 2015-03-09
      • 2018-05-20
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      相关资源
      最近更新 更多