Immagino che tu sappia che i tipi generici sono andati in fase di esecuzione. Ora, per vedere cosa succede dietro le quinte, diamo un'occhiata a questo pezzo di codice
public static Class<?> getClass(final Object object) {
return object.getClass();
}
public static void main(final String[] args) {
final List<String> s = new ArrayList<String>();
s.add("kshitiz");
// This is not typesafe. It should blow up at runtime
final List<Integer> i = new ArrayList(s);
System.out.println(getClass(i.get(0)));
System.out.println(i.get(0).getClass());
}
e l'uscita del javap -c
[...]
26: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
29: aload_2
30: iconst_0
31: invokeinterface #9, 2 // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
36: invokestatic #10 // Method getClass:(Ljava/lang/Object;)Ljava/lang/Class;
39: invokevirtual #11 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
42: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
45: aload_2
46: iconst_0
47: invokeinterface #9, 2 // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
52: checkcast #12 // class java/lang/Integer
55: invokevirtual #2 // Method java/lang/Object.getClass:()Ljava/lang/Class;
58: invokevirtual #11 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
61: return
Così si vede che in seconda convocazione, la stringa viene cast in un intero, mentre nel primo caso viene considerato come un oggetto. Finché la stringa viene gestita come qualsiasi altro oggetto, tutto va bene, ma non appena si chiama un metodo del tipo di elemento della lista, l'oggetto viene convertito in quel tipo.
Specificare la versione Java – m0skit0
Quale eccezione viene generata? – McCroskey
'Eccezione nel thread" main "java.lang.ClassCastException: java.lang.String non può essere lanciato su java.lang.Integer' – DavidS