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()
були загальними та обмежили його тип аргументу.