【问题标题】:Benefit of `contains[BB >: B](e: BB): Boolean` instead of `contains(e: Any): Boolean``contains[BB >: B](e: BB): Boolean` 代替 `contains(e: Any): Boolean` 的好处
【发布时间】:2017-11-28 05:53:44
【问题描述】:

在 Scala 中将 contains 定义为 contains[BB >: B](e: BB): Boolean 而不是 contains(e: Any): Boolean 有什么好处。

Scala 标准库中的Either.contains 使用第一个签名,我不清楚这种签名相对于第二个签名的好处。

【问题讨论】:

  • 类型安全。传递不是 BB >: B 将在编译时失败
  • @MrD 我猜,问题是如何你可以传递不是B的超类的东西。一切都是Any,而AnyB 的超类......没有类型,这个函数不会接受AFAICS。
  • 你不能传递不是 B 超类的东西,这就是重点。所以基本上没有 B 的子类型。我认为这是因为 B 中需要有一个正确定义的 == 可以用于比较
  • @MrD 除非您明确提供参数类型,否则您可以传递给contains 的任何内容都无法进行类型检查。试试看,你会看到的。
  • 令我感到困惑的是,为什么您会想要将不是 B 的东西传递给该函数...

标签: scala standard-library either


【解决方案1】:

在这种情况下,无:两个签名是等价的。但它提供了与其他成员签名的一致性,例如

 getOrElse[BB >: B](or: ⇒ BB): BB

对他们来说,这是有区别的,因为BB 是返回类型的一部分,所以如果我们传递一个B,我们就会得到B,而getOrElse(or: => Any): Any 是没有的。

让我感到困惑的是为什么你会想要将不是 B 的东西传递给那个函数

你不会的。但是contains(e: B) 不允许Either 是协变的。试试看,编译器会以B出现在逆变位置为由拒绝它。协方差意味着例如Either[A, SubtypeOfFoo]Either[A, Foo] 的子类型。所以任何对Either[A, Foo] 合法的调用对Either[A, SubtypeOfFoo] 也必须是合法的,这包括contains(Foo)

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 2012-05-05
    • 1970-01-01
    • 2015-03-26
    • 2012-11-10
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多