contains()
принимает Object
, поскольку объект, которому он соответствует, не обязательно должен быть того же типа, что и объект, который вы передаете в contains()
; это только требует, чтобы они были равны. Из спецификации contains()
, contains(o)
возвращает истину, если существует объект e
такой, что (o==null ? e==null : o.equals(e))
является истиной. Обратите внимание, что нет ничего требующего, чтобы o
и e
были одного типа. Это следует из того факта, что метод equals()
принимает в качестве параметра Object
, а не только тот же тип, что и объект.
Хотя обычно может быть верно, что многие классы имеют equals()
, определенные так, что его объекты могут быть равны только объектам своего собственного класса, что, конечно, не всегда так. Например, спецификация для List.equals()
гласит, что два объекта List
равны, если они оба List
s и имеют одинаковое содержимое, даже если они являются разными реализациями List. Итак, возвращаясь к примеру в этом вопросе, можно иметь Collection<ArrayList>
и для меня вызвать contains()
с LinkedList
в качестве аргумента, и он может вернуть true, если существует список с таким же содержимым. Это было бы невозможно, если бы contains()
были универсальными и ограничивали тип аргумента E
.
Фактически, тот факт, что contains()
принимает любой объект в качестве аргумента, позволяет использовать его интересно, чтобы проверить его на предмет существования в коллекции объекта, который удовлетворяет определенному свойству:
Collection<Integer> integers;
boolean oddNumberExists = integers.contains(new Object() {
public boolean equals(Object e) {
Integer i = (Integer)e;
if (i % 2 != 0) return true;
else return false;
}
});