Ответ 1
Это настоящий Catch-22 на Java.
Компилятор предупреждает вас, если вы не добавляете общий тип в List
:
// WARN: List is not typed
Class<? extends List> typeTry3 = ints.getClass();
Это потому, что в большинстве случаев лучше всего вводить списки.
Однако, из-за стирания типа, Java не может определить общий тип List
во время выполнения, и компилятор знает об этом. Поэтому на Class
нет метода, который вернет типизированный объект:
// ERROR: ints.getClass() doesn't return a Class<List<Integer>>, it returns a Class<List>
Class<? extends List<? extends Integer>> var = ints.getClass();
Итак, вы должны отдать его в типизированный список. Однако, как вы знаете, поскольку проверка типа выполнения не выполняется, Java предупреждает вас о любых нажатиях на типизированную переменную:
// WARN: Casting to typed List
Class<List<Integer>> typeTry2 = (Class<List<Integer>>) ints.getClass();
Любая попытка обойти это, по сути, является средством запутывания компилятора и неизбежно будет запутанной.
Лучше всего пойти с вариантом B:
С другой стороны, если подавление предупреждений является единственным способом, что является самым безопасным для подавления?
Самый безопасный способ подавить это предупреждение - сделать вашу аннотацию @SuppressWarnings("unchecked")
максимально возможной. Поместите их выше каждого отдельного непроверенного броска. Таким образом, совершенно ясно, кто вызывает предупреждение.