Спецификация для содержит метод говорит:
возвращает истину, если и только если эта коллекция содержит, по меньшей мере, один элемент е такой, что (o==null ? e==null : o.equals(e))
[DOCS оракула] [1]
Однако , он также говорит, что он может выбросить NullPointerException
, если коллекция не разрешает нулевые элементы или ClassCastException
, если тип указанного элемента несовместим с этой коллекцией. Они обозначены как optional
.
Кроме того, он также говорит, что:
Многие методы в Collections Framework интерфейсы определены в терминах метода Equals
но:
Данная спецификация не должна быть подразумевается, что вызов Collection.contains с аргументом non-null o приведет к вызову o.equals (e) для любого элемента e
Поэтому я пришел к выводу, что это какой-то хак, позволяющий реализациям определять разные типы поведения (например, принятие нулевых элементов) и оптимизации (например, переопределение метода equals для класса, чтобы вы могли проверить, содержится ли элемент в коллекции без ссылки на него).
Я объясню последний пример:
public class A {
public void initialize() {
// Lots of code and heavy initialization
}
public String id;
@Override
public int hashCode() {
return id.hashCode();
}
@Override
public boolean equals(Object o) {
return this.hashCode() == o.hashCode();
}
}
А потом:
SomeCollection<A> collection = new SomeCollection<A>();
// Create an element and add it to the collection
A a = new A();
a.initialize(); // Heavy initialization
element.id = "abc";
collection.add(a);
// Check if the collection contains that element
// We create a second object with the same id, but we do not initialize it
A b = new A();
b.id = "abc";
// This works for many common collections (i.e. ArrayList and HashSet)
collection.contains(b);
На самом деле, есть несколько методов, как indexOf(Object o)
и remove(Object o)
, которые следуют этим. Поэтому я не думаю, что это совместимость, но это сделано специально для таких решений.
http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#contains(java.lang.Object)
здесь хорошо читать на эту тему http://www.javaworld.com/article/2073330/the-contains-trap-in-java-collections.html – nem035
, связанные, или, вернее, дубликата http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic и http: // stackoverflow.com/questions/104799/why-arent-java-collections-remove-methods-generic – Marco13