Saat Anda mendeklarasikan
public static <T> void foo(List<T>... bar) kompiler mengubahnya menjadi
public static <T> void foo(List<T>[] bar) lalu ke
public static void foo(List[] bar)
Bahaya kemudian muncul bahwa Anda akan keliru menetapkan nilai yang salah ke dalam daftar dan kompiler tidak akan memicu kesalahan apa pun. Misalnya, jika Ta Stringmaka kode berikut akan dikompilasi tanpa kesalahan tetapi akan gagal saat runtime:
// 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);
Jika Anda meninjau metode untuk memastikan bahwa itu tidak mengandung kerentanan seperti itu maka Anda dapat membuat anotasi dengan @SafeVarargsuntuk menekan peringatan. Untuk antarmuka, gunakan@SuppressWarnings("unchecked") .
Jika Anda mendapatkan pesan kesalahan ini:
Metode Varargs dapat menyebabkan tumpukan timbunan dari parameter varargs yang tidak dapat diverifikasi
dan Anda yakin bahwa penggunaan Anda aman maka Anda harus menggunakannya @SuppressWarnings("varargs"). Lihat Apakah @SafeVarargs anotasi yang sesuai untuk metode ini? dan https://stackoverflow.com/a/14252221/14731 untuk penjelasan yang bagus tentang jenis kesalahan kedua ini.
Referensi: