为什么集合上的“包含”不需要正确的类型?

Why is `contains` on collections not requiring the correct type?

如何编译:

scala> val x: Vector[Int] = Vector(1,2,3)
val x: Vector[Int] = Vector(1, 2, 3)

scala> x.contains("hello")
val res4: Boolean = false

scala> x.contains(List(Map("anything" -> 3.14)))                                                 
val res5: Boolean = false

编辑:

这与 this other question 是分开的,后者是推断集合的元素类型(Any),而此处是明确设置(Int)。

签名 is(在 3.0.0 中;我建议在此类问题中始终包含 language/library 版本,尤其是对于 Scala)

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

这意味着参数类型必须是Int的超类型,"hello"被推断为Any,这确实是这样的超类型。

签名的原因而不是可能更符合预期

def contains(elem: A): Boolean

是那个签名不允许 Vector 和其他集合是协变的。

具体来说,如果 Vector[Int] 扩展 Vector[Any],并且您可以在 Vector[Any] 上调用 contains(Any),您也必须能够在 Vector[Int].