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 T
a String
maka 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 @SafeVarargs
untuk 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: