`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)
.
在 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)
.