2011-01-13 14 views
8

Eventuali duplicati:
What are the reasons why Map.get(Object key) is not (fully) genericPerché java.util.Map.get (...) non è generico?

Questo metodo e una serie di altri metodi nell'interfaccia Mappa non sono generici. Quasi ovunque sia previsto un parametro come parametro, accetta invece Object, ovvero remove, get e containsKey.

Qualche idea sul motivo per cui hanno preso questa decisione. La mia ipotesi è che sia stato fatto per supportare il codice legacy, ma per me, penso che sia una posizione debole.

Qualcuno può fornirmi un motivo specifico per cui sarebbe preferibile accettare l'oggetto qui anziché KeyType.

+3

Questa domanda è stata posta molte volte negli ultimi 6 anni. Ti suggerisco di cercare le risposte esistenti –

+0

Lo stesso con remove, containsValue, containsKey, ... – aioobe

risposta

8

Gli oggetti utilizzati per recuperare/rimuovere/verificare l'esistenza di una determinata chiave non devono necessariamente essere dello stesso tipo dell'oggetto utilizzato per memorizzarlo (= la chiave).

Deve essere equal e restituire lo stesso hashCode come chiave, ma nulla nelle specifiche dice che deve essere dello stesso tipo.

Questo fatto è usato raramente e il più delle volte si recuperano i valori con le stesse chiavi (o almeno oggetti dello stesso tipo) di quelli che si usano per memorizzarli.

Ma poiché questo era un caso d'uso supportato nel "vecchio" HashMap, deve essere supportato anche nella versione generica.

Si noti che tutti i metodi che keySet() utilizza il tipo specifico, come è sicuro di tornare esattamente gli oggetti utilizzati come chiavi quando put() è stato chiamato.

+0

Ah, molto bene. Grazie per aver risposto. Suppongo che abbia un po 'di senso. Immagino che tu possa cercare per Integers una mappatura che usa Doubles come chiavi ... –

+0

@Kevin: quel exampe specifico non funzionerà, perché 'Integer' e' Double' non hanno implementazioni 'equals()' compatibili. –

Problemi correlati