Để làm rõ, hãy để tôi hơi viết lại ví dụ ...
Tôi xin nói, các chênh lệch cruxial giữa:
void a(Object o) {
Integer i = (Integer) o;
...
}
và
void a(Object o) {
List<Integer> list = (List<Integer>) o;
...
}
là, cho rằng có lỗi loại, lần truyền đầu tiên sẽ luôn là ngay lập tức ném một RuntimeException (cụ thể là một ClassCastException) khi được thực thi.
Trong khi thứ hai sức mạnh không - miễn là các tham số đầu vào o là bất kỳ loại List<?>
, thực hiện sẽ chỉ cần tiến hành, mặc dù của một dàn diễn viên không chính xác.
Cho dù mã sẽ ở đâu đó sau ném ngoại lệ hay không, tùy thuộc vào những gì bạn làm với danh sách.
Nhưng không quan tâm, ngoại lệ có thể không được ném tại dòng nơi dàn diễn viên được thực hiện, nhưng ở một nơi khác (có thể là một lỗi khó khăn để theo dõi) hoặc hoàn toàn không.
Đó là những gì tôi hiểu, là lý do mà các nhà thiết kế trình biên dịch coi là một cảnh báo chỉ thích hợp trong trường hợp thứ hai.
Dòng thứ hai tạo ra cảnh báo vì chỉ có Generics tạo ra cảnh báo như vậy. Việc đầu tiên không chứa chung chung, do đó không có cảnh báo. –