为什么集合上的“包含”不需要正确的类型?
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]
.
如何编译:
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]
.