在Scala中将contains
定义为contains[BB >: B](e: BB): Boolean
而不是contains(e: Any): Boolean
有什么好处。
Either.contains
使用第一个签名,我不清楚这种签名对第二个签名的好处。
答案 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)
。