2016-10-28 6 views
0

Ich bin Casting Liste <T> <String> zur Liste. getClass() -Methode für ein beliebiges Element der Liste gibt die tatsächliche Elementklasse von List, d. h. T statt String, zurück. Sollte Java nicht String anstelle der tatsächlichen Klasse zurückgeben, da die Liste in die Liste von String gegossen wurde?Casting Liste <T> zur Liste <String> Typ

public cast (List<?> unsortedList) { 
    List<String> unsortedListOfPrimitives = (List<String>)unsortedList; 
    System.out.println(unsortedListOfPrimitives.get(0).getClass()); 
} 


cast(List<BigDecimal> unsortedList); 

Output : java.math.BigDecimal 
+1

Casting ändert ein Objekt in Java nicht, im Gegensatz zu C++. Sie sagen Java nur, dass der Typ T "String" war. Wenn Sie 'List aList = neue Liste ()' und später Cast 'List sList = (Liste ) aList;', 'sList' ist das gleiche Objekt, Sie haben gerade seinen Typ falsch. –

+0

Es würde helfen, wenn Sie ein konkretes Beispiel geben würden. –

+0

Danke, Thomas. Ich habe die Frage bearbeitet, um ein Beispiel hinzuzufügen. –

Antwort

1

Java-Generika funktionieren nicht immer so, wie Sie es erwarten würden.

Insbesondere ändert sich nicht wirklich eine generische auf einen bestimmten Typ Gießen Sie das Objekt, und Sie können unsichere Ergebnisse, wenn Sie dies tun und sind nicht zu 100% sicher, dass Sie es richtig haben.

Also das Objekt, das Sie auf List<String> umgewandelt haben, ist immer noch eine Liste mit BigDecimal Einträge, die Sie gerade falsch umgesetzt haben.

Dies ist ein Fall, in dem Java ist unsichere geben - wie ein Object-Integer typen unsicher (aber zur Laufzeit, unsicheren Object-Integer Abgüsse Gießen wird zum Zeitpunkt der Besetzung scheitern, während generische Abgüsse werden nicht scheitern bis später.)

+0

Es ist nur unsicher, wenn Sie Warnungen zur Kompilierungszeit ignorieren. – shmosel

Verwandte Themen