Из-за стирания типа не все нарушения системы типа generi c выявляются во время выполнения. Эта ситуация также называется куча загрязнений . Но вы должны были получить «непроверенные» предупреждения от компилятора.
Но ваше предположение, что вы создаете List<Integer>
, в любом случае неверно. Вы передаете Integer.class
в качестве аргумента для параметра T clazz
, следовательно, T
- это не Integer
, а Class<Integer>
.
Правильное объявление generi c будет:
public static void main(String[] args) {
List<Integer> list = generic(Integer.class);
System.out.println(list);
}
private static <T> List<T> generic(Class<T> clazz) {
List<T> list = new ArrayList<>();
return list;
}
Теперь, когда в программе нет «непроверенных» предупреждений, вы можете быть уверены, что во время выполнения не произойдет никакого загрязнения кучи. Если вам нужны дополнительные гарантии, вы можете использовать
public static void main(String[] args) {
List<Integer> list = generic(Integer.class);
System.out.println(list);
}
private static <T> List<T> generic(Class<T> clazz) {
List<T> list = Collections.checkedList(new ArrayList<>(), clazz);
list.add((T) Arrays.asList("create", "generic")); // will fail at runtime
list.add((T) Arrays.asList("create", "generic2"));
return list;
}
Однако, когда вы слушаете и отвечаете на предупреждения компилятора, вам не нужны дополнительные проверки во время выполнения.