Sądzę, że zdajesz sobie sprawę, że typy ogólne zniknęły w czasie wykonywania. Teraz, aby zobaczyć, co się dzieje za kulisami, spójrzmy na ten kawałek kodu
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());
}
i wyjściu 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
Więc widać, że w drugim naborze, ciąg jest rzutuje na liczbę całkowitą, podczas gdy w pierwszym przypadku jest traktowany jako obiekt. Tak długo, jak ciąg jest obsługiwany tak jak każdy inny obiekt, wszystko jest w porządku, ale jak tylko wywołasz metodę typu elementu z listy, obiekt jest rzutowany na ten typ.
Podaj wersję Java – m0skit0
Jakiego wyjątku ona powoduje? – McCroskey
'Wyjątek w wątku" główny "java.lang.ClassCastException: java.lang.String nie może być rzutowany na java.lang.Integer' – DavidS