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?
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
@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. –
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. –