Why does Iterator have a contains method but Iterable does not, in Scala 2.8?

前端 未结 2 360
忘了有多久
忘了有多久 2020-12-10 12:38

I would like to call \'contains\' on my Iterables :-)

2条回答
  •  情书的邮戳
    2020-12-10 12:42

    The reason Iterable does not have a contains method is because the way it is defined can have direct consequences on variance. Basically, there are two type signatures that make sense for it:

    def contains(v: Any): Boolean
    def contains(v: A): Boolean
    

    The second definition has increased type safety. However, A, which is the type parameter of collection, appears in a contra-variant position, which forces the collection to be invariant. It could be defined like this:

    def contains[B >: A](v: B): Boolean
    

    but that wouldn't offer any improvement over the first signature, using Any.

    As a consequence of this, you'll see that immutable.Seq is co-variant and uses the first signature, while immutable.Set is invariant and uses the second signature.

提交回复
热议问题