我正在查看Scala中的Option类,并且遇到了contains方法:
final def contains[A1 >: A](elem: A1): Boolean
选项是协变的,所以我理解它不能只使用A作为elem的类型。但是,鉴于A1类型从未使用过,为什么方法只能是这样:
final def contains(elem: Any): Boolean
这只是一种风格还是我错过了重要的东西?
答案 0 :(得分:3)
没有理由,这只是一种疏忽。实际上,它甚至不是唯一的一个。例如,Either.joinRight
也包含不必要的下限。但是因为删除它们意味着打破源和二进制兼容性,所以到目前为止它并没有发生。
答案 1 :(得分:2)
这与Option
是协变的事实直接相关,事实上,为了使类型匹配,这是必需的。
class Foo(x: Int)
object Bar entends Foo(0)
def foo(t: Option[Foo]) = t contains (new Foo(2))
我实际上可以传递一种Option[Bar.type]
类型,它会"工作"因为Bar
是Foo
,并且类型的类型有界性要求它也接受类型为参数化类型A
的超类型。
val res = foo(Some(Bar))
>> res0: Boolean = false
请注意,上面实际上是在contains
的实例上调用Option[Bar.type]
。因此,[A1 >: A]
。