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