Scala:为什么Seq.contains采用Any参数,而不是序列类型的参数?

Set*_*sue 23 scala scala-collections

那么为什么List(1,2,3,4).contains("wtf")甚至编译?如果编译器拒绝这个会不会很好?

Dan*_*ral 22

很多有趣的答案,但这是我自己的理论:如果contains没有收到Any,那么Seq就不可能是共同变体.

见,例如Set,这是不是共同的变体,其contains采取A的,而不是一个Any.

其原因留给读者练习.;-)但这里有一个提示:

scala> class Container[+A](elements: A*) {                         
     |   def contains(what: A): Boolean = elements exists (what ==)
     | }
<console>:7: error: covariant type A occurs in contravariant position in type A of value what
         def contains(what: A): Boolean = elements exists (what ==)
                      ^
Run Code Online (Sandbox Code Playgroud)

  • 并回答Daniel的"为读者练习":如果Seq是协变的,那么例如Seq [Int]必须有资格作为Seq [Any],那么我必须能够将任何东西传递给它的contains方法. (6认同)