`contains [BB>:B](e:BB)的好处:布尔`而不是'包含(e:任意):布尔值`

时间:2017-06-24 23:56:43

标签: scala standard-library either

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

Scala标准库中的

Either.contains使用第一个签名,我不清楚这种签名对第二个签名的好处。

1 个答案:

答案 0 :(得分:3)

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

 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)