`contains[BB >: B](e: BB): Boolean` 而不是 `contains(e: Any): Boolean` 的好处

Benefit of `contains[BB >: B](e: BB): Boolean` instead of `contains(e: Any): Boolean`

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

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

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

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

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

What boggles me is why you would ever want to pass something that's not a B to that function

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