Коли ви заявляєте
public static <T> void foo(List<T>... bar) компілятор перетворює його в
public static <T> void foo(List<T>[] bar) то до
public static void foo(List[] bar)
Тоді виникає небезпека, що ви помилково призначите неправильні значення у списку, і компілятор не спровокує жодної помилки. Наприклад, якщо Tє, 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 для приємного пояснення цього другого виду помилок.
Список літератури: