Коли ви заявляєте
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 для приємного пояснення цього другого виду помилок.
Список літератури: