Zaskoczył mnie fakt, że Map<?,?>
nie jest to plik Collection<?>
.
Pomyślałem, że miałoby to dużo sensu, gdyby zostało to zadeklarowane jako takie:
public interface Map<K,V> extends Collection<Map.Entry<K,V>>
W końcu a Map<K,V>
to zbiór Map.Entry<K,V>
, prawda?
Czy jest więc dobry powód, dla którego nie jest zaimplementowany jako taki?
Dziękuję Cletusowi za najbardziej autorytatywną odpowiedź, ale wciąż zastanawiam się, dlaczego, jeśli już możesz zobaczyć Map<K,V>
as Set<Map.Entries<K,V>>
(via entrySet()
), zamiast tego nie tylko rozszerza ten interfejs.
Jeśli a
Map
to aCollection
, jakie są elementy? Jedyną rozsądną odpowiedzią jest „Pary klucz-wartość”
Dokładnie, interface Map<K,V> extends Set<Map.Entry<K,V>>
byłoby świetnie!
ale zapewnia to bardzo ograniczoną (i niezbyt użyteczną)
Map
abstrakcję.
Ale jeśli tak jest, to dlaczego jest entrySet
określony przez interfejs? To musi być jakoś przydatne (i myślę, że łatwo jest polemizować o takie stanowisko!).
Nie możesz zapytać, na jaką wartość jest przypisany dany klucz, ani nie możesz usunąć wpisu dla danego klucza, nie wiedząc, na jaką wartość jest mapowany.
Nie mówię, że to wszystko Map
! Może i powinien zachować wszystkie inne metody (z wyjątkiem tej entrySet
, która jest teraz zbędna)!