remove()
(в Map
, а также в Collection
) не является универсальным, потому что вы должны иметь возможность передавать любой тип объекта в remove()
. Удаленный объект не обязательно должен быть того же типа, что и объект, который вы передаете в remove()
; это только требует, чтобы они были равны. Из спецификации remove()
, remove(o)
удаляет объект e
, так что (o==null ? e==null : o.equals(e))
равен true
. Обратите внимание, что нет ничего требующего, чтобы o
и e
были одного типа. Это следует из того факта, что метод equals()
принимает в качестве параметра Object
, а не только тот же тип, что и объект.
Хотя, как правило, верно, что многие классы имеют equals()
, определенные так, что его объекты могут быть равны только объектам своего собственного класса, что, конечно, не всегда так. Например, спецификация для List.equals()
гласит, что два объекта List равны, если они оба являются списками и имеют одинаковое содержимое, даже если они являются различными реализациями List
. Итак, возвращаясь к примеру в этом вопросе, можно иметь Map<ArrayList, Something>
и для меня вызвать remove()
с LinkedList
в качестве аргумента, и он должен удалить ключ, представляющий собой список с таким же содержимым. Это было бы невозможно, если бы remove()
были универсальными и ограничивали тип аргумента.