Khi bạn tuyên bố
public static <T> void foo(List<T>... bar)
trình biên dịch chuyển đổi nó thành
public static <T> void foo(List<T>[] bar)
sau đó
public static void foo(List[] bar)
Nguy hiểm sau đó phát sinh là bạn sẽ gán nhầm các giá trị không chính xác vào danh sách và trình biên dịch sẽ không kích hoạt bất kỳ lỗi nào. Ví dụ: nếu T
là một String
thì đoạn mã sau sẽ biên dịch không có lỗi nhưng sẽ thất bại khi chạy:
// 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);
Nếu bạn đã xem lại phương pháp để đảm bảo rằng nó không chứa các lỗ hổng như vậy thì bạn có thể chú thích nó @SafeVarargs
để ngăn chặn cảnh báo. Đối với giao diện, sử dụng @SuppressWarnings("unchecked")
.
Nếu bạn nhận được thông báo lỗi này:
Phương pháp Varargs có thể gây ra ô nhiễm đống từ tham số varargs không thể xác định lại
và bạn chắc chắn rằng việc sử dụng của bạn an toàn thì bạn nên sử dụng @SuppressWarnings("varargs")
thay thế. Xem @SafeVarargs có chú thích thích hợp cho phương pháp này không? và https://stackoverflow.com/a/14252221/14731 cho một lời giải thích hay về loại lỗi thứ hai này.
Người giới thiệu: