2011-10-26 18 views
5

Để được trực tiếp ở đây là ví dụ:Java Generics: Trên ArrayList (không giới hạn loại ký tự đại diện), thêm và phương pháp addAll cư xử khác nhau

ArrayList <?> x = new ArrayList(); 
    ArrayList y = new ArrayList(); 
    x.add("abc"); // Clause 1. Compilation error - No problemo. Understood. 
    x.addAll(y); // Clause 2. No compilation error 

Đối với ký tự đại diện vô biên, người ta không thể thêm. Tại sao không có lỗi biên dịch trên câu lệnh cuối cùng?

Trả lời

7

Bởi vì bạn đang gọi phương thức với một loại thô. Trình biên dịch không thể thực hiện kiểm tra kiểu. Nếu bạn tạo y generics của người dùng, addAll(..) sẽ không thành công.

+1

Ok. Tôi thấy ý nghĩa. Khoản 1 sẽ không thành công - vì loại được biết và nó tuân theo quy tắc chung nơi ký tự đại diện không bị chặn ngăn chặn việc thêm. Khoản 2, vì phần tử kiểu không xác định, nó sử dụng quy tắc chung của việc trộn mã kế thừa và mã chung. Tôi đã làm đúng chứ? – yapkm01

+0

có - trong trường hợp các loại thô, tất cả các công cụ generics được loại bỏ. – Bozho

+0

@ yapkm01 Generics nơi thêm muộn để ngôn ngữ nên họ phải được thiết kế theo một cách mà cho phép tương tác dễ dàng với số lượng lớn các thư viện chung không tồn tại, kết quả là trình biên dịch bỏ qua Generics trong sự hiện diện của các loại nguyên liệu. – josefx

Các vấn đề liên quan