为什么"包含"方法"选项"使用带有下限的第二种类型而不是"任何"类型?

时间:2015-02-13 14:07:35

标签: scala

我正在查看Scala中的Option类,并且遇到了contains方法:

final def contains[A1 >: A](elem: A1): Boolean

选项是协变的,所以我理解它不能只使用A作为elem的类型。但是,鉴于A1类型从未使用过,为什么方法只能是这样:

final def contains(elem: Any): Boolean

这只是一种风格还是我错过了重要的东西?

2 个答案:

答案 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]类型,它会"工作"因为BarFoo,并且类型的类型有界性要求它也接受类型为参数化类型A的超类型。

val res = foo(Some(Bar))
>> res0: Boolean = false

请注意,上面实际上是在contains的实例上调用Option[Bar.type]。因此,[A1 >: A]