เมื่อคุณประกาศ
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สำหรับคำอธิบายที่ดีเกี่ยวกับข้อผิดพลาดประเภทที่สองนี้
อ้างอิง: