我想在我的 Iterables 上调用 'contains' :-)
问问题
3952 次
2 回答
27
Iterable
没有方法的原因contains
是因为它的定义方式会对方差产生直接影响。基本上,有两种类型签名对它有意义:
def contains(v: Any): Boolean
def contains(v: A): Boolean
第二个定义增加了类型安全性。但是,A
作为集合的类型参数, 出现在逆变位置,这迫使集合保持不变。可以这样定义:
def contains[B >: A](v: B): Boolean
但这不会比第一个签名提供任何改进,使用Any
.
因此,您会看到它immutable.Seq
是协变的并使用第一个签名,而immutable.Set
它是不变的并使用第二个签名。
于 2010-07-13T01:58:00.800 回答
5
我不知道为什么contains
没有在Iterable
or上定义TraversableOnce
,但您可以自己轻松定义:
class TraversableWithContains[A](underlying: TraversableOnce[A]) {
def contains(v: Any): Boolean =
underlying.exists(_ == v)
}
implicit def addContains[A](i: Iterable[A]) = new TraversableWithContains(i)
并像在 Iterable 上定义一样使用它:
val iterable: Iterable[Int] = 1 to 4
assert(iterable.contains(3))
assert(!iterable.contains(5))
于 2010-07-12T16:24:29.067 回答