Причина, по которой 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
является инвариантным и использует вторую подпись.