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