2011-01-13 17 views
8

Powiel możliwe:
What are the reasons why Map.get(Object key) is not (fully) genericDlaczego java.util.Map.get (...) nie jest generyczny?

Ta metoda i szereg innych metod interfejsu mapy nie są uniwersalne. Prawie wszędzie, gdzie spodziewana jest wartość klucza jako parametr, akceptuje ona zamiast niej Object, a mianowicie remove, get i containsKey.

Każdy pomysł, dlaczego podjął tę decyzję. Zakładam, że zrobiono to, aby wesprzeć starszy kod, ale dla mnie uważam, że jest to słaba pozycja.

Czy ktoś może podać mi konkretny powód dlaczego lepiej byłoby przyjąć Object tutaj zamiast KeyType.

+3

To pytanie było zadawane wielokrotnie w ciągu ostatnich 6 lat. Proponuję wyszukać istniejące odpowiedzi –

+0

To samo z usunięciem, zawiera wartość, zawiera klucz, ... – aioobe

Odpowiedz

8

Obiekty wykorzystywane do pobierania/usunąć/sprawdzenia istnienia danego klawisza nie muszą być tego samego typu jak przedmiot używany do go (= klawisz) przechowywać.

Musi to być equal i zwrócić ten sam hashCode jako klucz, ale nic w specyfikacji nie mówi, że musi być tego samego typu.

Ten fakt jest rzadko używany i większość czasu będzie pobierać wartości tymi samymi kluczami (lub przynajmniej obiektami tego samego typu), co te, których używasz do ich przechowywania.

Ale ponieważ był to obsługiwany przypadek użycia w "starym" HashMap, musi być obsługiwany również w wersji generycznej.

Należy pamiętać, że wszystkie metody używane przez keySet() używają określonego typu, ponieważ na pewno zwrócą dokładnie te obiekty, które były używane jako klucze, gdy wywołano put().

+0

Ah, bardzo dobrze. Dzięki za odpowiedź. Przypuszczam, że to ma sens. Domyślam się, że możesz wyszukiwać według Integers, używając Doubles jako kluczy ... –

+0

@Kevin: ten konkretny exampe nie zadziała, ponieważ 'Integer' i' Double' nie mają kompatybilnych implementacji 'equals()'. –

Powiązane problemy