Когда вы объявляете
public static <T> void foo(List<T>... bar)
компилятор преобразует его в
public static <T> void foo(List<T>[] bar)
затем к
public static void foo(List[] bar)
Тогда возникает опасность, что вы ошибочно назначите неверные значения в список, и компилятор не вызовет никаких ошибок. Например, если T
is, String
то следующий код скомпилируется без ошибок, но завершится с ошибкой во время выполнения:
// First, strip away the array type (arrays allow this kind of upcasting)
Object[] objectArray = bar;
// Next, insert an element with an incorrect type into the array
objectArray[0] = Arrays.asList(new Integer(42));
// Finally, try accessing the original array. A runtime error will occur
// (ClassCastException due to a casting from Integer to String)
T firstElement = bar[0].get(0);
Если вы проверили метод, чтобы убедиться, что он не содержит таких уязвимостей, вы можете аннотировать его, @SafeVarargs
чтобы подавить предупреждение. Для интерфейсов используйте @SuppressWarnings("unchecked")
.
Если вы получили это сообщение об ошибке:
Метод Varargs может вызвать загрязнение кучи из-за неперечисляемого параметра varargs
и вы уверены, что ваше использование безопасно, тогда вы должны использовать @SuppressWarnings("varargs")
вместо этого. См. @SafeVarargs соответствующую аннотацию для этого метода? и https://stackoverflow.com/a/14252221/14731 для хорошего объяснения этого второго вида ошибки.
Ссылки: