2015-05-23 9 views
7

Perché non c'è un avviso per il codice sottostante?Perché non vi è alcun avviso durante il trasferimento dall'oggetto alla raccolta jolly illimitata?

public void some(Object a){ 
    Map<?, ?> map = **(Map<?,?>)a**; //converting unknown object to map  
} 

Mi aspettavo che l'RHS avesse un avviso non controllato.

Anche se questo codice ha un avvertimento:

public void some(Object a){ 
    Map<Object, Object> map = **(Map<Object,Object>)a**; 
    //converting unknown object to Map<Object,Object>  
} 

Inoltre, per caso al di sotto non c'è nessun avviso:

String str = (String) request.getAttribute("asd") //returns Object 

Questo significa che gli avvertimenti non controllato è venuto con i farmaci generici? Non c'erano tali avvertimenti prima dell'introduzione dei farmaci generici in Java?

risposta

1

Si ottiene alcun avvertimento "incontrollato", perché il cast è completamente "controllata" - un cast di Map<?,?> ha solo bisogno di garantire che l'oggetto è un Map (e niente altro), e che è completamente controllabile in fase di esecuzione. In altre parole, Map<?,?> è un tipo reifiable.

6

Sì, l'avviso non controllato è rilevante solo per i tipi generici.

Che cosa significa: questo cast da Object a Map<T1, T2> potrebbe riuscire perché l'oggetto è effettivamente una mappa, ma il runtime non ha modo, a causa della cancellazione del tipo, per verificare che sia un Map<T1, T2>. Potrebbe benissimo essere un Map<T3, T4>. Quindi potresti benissimo rompere la sicurezza del tipo della mappa inserendo elementi T1, T2 all'interno o ottenere un ClassCastException quando cerchi di leggere i valori dalla mappa.

Non hai avvisi per il primo cast perché stai trasmettendo a uno Map<?, ?>, il che significa che la chiave e il tipo di valore sono sconosciuti, il che è vero. Non sarà possibile eseguire un'operazione non sicura su una mappa di questo tipo senza cast aggiuntivi: non è possibile aggiungere nulla a tale mappa e l'unica cosa che si può ottenere è rappresentata dalle istanze di Object.

+0

Potrei sbagliarmi ma non sarebbe il cast da 'Mappa ' a 'Mappa ' risultato in un 'ClassCastException'? Non sarebbe davvero possibile aggiungere nulla alla 'Mappa' perché il programma si bloccherà. – CKing

+3

@ChetanKinger no, ed è per questo che ricevi un avviso. A causa della cancellazione dei tipi, il runtime può verificare che l'oggetto sia una mappa, ma non può indicare il tipo generico della mappa. –

+2

No, ciò non comporterebbe un ClassCastException. In Runtime, la JVM non sa a quali tipi sono stati associati i parametri del tipo, quindi la JVM non ha modo di verificare se il tuo cast su Map è valido o meno - puoi facilmente lanciare una Map ad esso perché la JVM non può dire la differenza. –

Problemi correlati