Il tuo esempio ti fa sembrare che tu abbia informazioni sul tipo che non hai mai avuto. Lei ha scritto:
Map map = new HashMap();
Set <Map.Entry> set = map.entrySet();
for (Map.Entry entry : set) {} // fine
for (Map.Entry entry : map.entrySet()) {} // compilation error
Ma map.entrySet()
sta tornando Set
, non Set <Map.Entry>
. Hai eseguito un compito non controllato che "aggiunge" informazioni sul tipo.
Nel secondo ciclo for, non sappiamo cosa c'è all'interno dello Set
, quindi non possiamo eseguire iterazioni su Set <Map.Entry>
senza un cast esplicito.
Ad esempio, confrontare l'esempio originale con quello in cui non "aggiungere" le informazioni sul tipo con l'assegnazione deselezionata.
Map map = new HashMap();
Set set = map.entrySet();
for (Map.Entry entry : set) {
} // Object cannot be cast to Entry
for (Map.Entry entry : map.entrySet()) {
} // Object cannot be cast to Entry
In questo caso, entrambi per cicli producono un errore di compilazione.
Questo comportamento è documentato nel linguaggio Java Specification, paragrafo 4.8:
Il tipo di un costruttore (§8.8), metodo istanza (§8.8, §9.4), o non statico campo (§8.3) M di un tipo non elaborato C non ereditato da le sue superclassi o superinterfacce è la cancellazione del suo tipo nella dichiarazione generica corrispondente a C. Il tipo di un membro statico di un tipo non elaborato C è il come il suo tipo nella dichiarazione generica corrispondente a C.
'Set set = map.entrySet();' è un "incarico incontrollato", che è consentito. Questo è ciò che consente al primo iteratore di funzionare. Puoi ottenere lo stesso risultato rendendo esplicito il cast nel secondo caso: 'for (Map.Entry entry: (Set ) map.entrySet()) {}' –
Richard
La regola base da seguire è: mai usare raw tipi. Sono piuttosto facili da evitare (di solito sostituiti con un parametro jolly, ad esempio "Set" si trasforma in "Set ") e l'unica ragione per la loro esistenza è la retrocompatibilità con il codice pre-generico. –
@JoachimSauer, d'accordo, ma presumo che questa sia una domanda per lo più accademica. edit: Ok, quindi non è accademico, ma comunque è una domanda divertente. – DavidS