Этот код выдает предупреждение при компиляции. В предупреждении говорится:
Note: MyTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
А на самом деле, когда вы делаете то, что выдает 4 предупреждающих сообщения:
MyTest.java:5: warning: [unchecked] Possible heap pollution from parameterized vararg type E
initalizeAndAddToCollection(Class<C> clazz, E... entries) {
^
where E,C are type-variables:
E extends Object declared in method <E,C>initalizeAndAddToCollection(Class<C>,E...)
C extends Collection<E> declared in method <E,C>initalizeAndAddToCollection(Class<C>,E...)
MyTest.java:18: warning: [unchecked] unchecked cast
return (C) collection;
^
required: C
found: Collection<E>
where E,C are type-variables:
E extends Object declared in method <E,C>initalizeAndAddToCollection(Class<C>,E...)
C extends Collection<E> declared in method <E,C>initalizeAndAddToCollection(Class<C>,E...)
MyTest.java:23: warning: [unchecked] unchecked method invocation: method initalizeAndAddToCollection in class MyTest is applied to given types
initalizeAndAddToCollection(ArrayList.class, 1.0);
^
required: Class<C>,E[]
found: Class<ArrayList>,double
where C,E are type-variables:
C extends Collection<E> declared in method <E,C>initalizeAndAddToCollection(Class<C>,E...)
E extends Object declared in method <E,C>initalizeAndAddToCollection(Class<C>,E...)
MyTest.java:23: warning: [unchecked] unchecked conversion
initalizeAndAddToCollection(ArrayList.class, 1.0);
^
required: ArrayList<Integer>
found: ArrayList
4 warnings
Эти предупреждения объясняют, почему этот, казалось бы, некорректный код компилируется. Вы делаете то, что компилятор скажет , что вы ошиблись.
Почему этот код выполняется.
Потому что это не нарушает безопасность типов во время выполнения.
Тип стирания означает, что в коллекции фактически хранятся ссылки на Object
.
Когда вы затем делаете System.out.print(list.get(0));
, тип параметра для вызова print
равен Object
. Это означает, что не требуется явное приведение к Integer
.
и как мне сделать так, чтобы это приводило к ошибке компиляции или времени выполнения?
Если вам нужна ошибка во время компиляции, скажите компилятору обрабатывать предупреждения как ошибки. (Или проверьте предупреждения в выводе компиляции.)
Если вам нужна ошибка времени выполнения, вам нужно добавить некоторые явные проверки типов времени выполнения, вероятно, в вашем методе initalizeAndAddToCollection
.