Đó là phức tạp ...
Đối với bất kỳ loại biến T
, spec nói http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4
Mỗi loại biến ... có một ràng buộc. Nếu không có ràng buộc nào được khai báo cho một biến kiểu, thì Object được giả định.
Người ta cũng nghĩ rằng đó cũng đúng với ký tự đại diện và ?
chỉ là viết tắt của ? extends Object
.
Tuy nhiên, tìm kiếm thông qua thông số kỹ thuật, không có bằng chứng nào cho thấy ký tự đại diện phải có giới hạn trên (hoặc giới hạn dưới). "Không giới hạn" ?
được xử lý nhất quán rõ ràng từ các ký tự đại diện bị chặn.
Chúng ta có thể suy ra từ quy tắc subtyping, mà List<?>
và List<? extends Object>
là tuýp phụ của nhau, ví dụ, họ cơ bản cùng loại.
Tuy nhiên, đặc điểm xử lý chúng riêng biệt. Ví dụ http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7List<?>
là một loại reifiable, nhưng List<? extends Object>
là không, có nghĩa là
// ok
List<?>[] xx = {};
// fail
List<? extends Object>[] yy = {};
// ok
boolean b1 = (y instanceof List<?>);
// fail
boolean b2 = (y instanceof List<? extends Object>);
Tôi không hiểu tại sao mặc dù. Có vẻ như hoàn toàn tốt khi nói một ký tự đại diện phải có giới hạn trên và giới hạn dưới, mặc định là Object
và null type
.
Wow! Bỏ lỡ điều đó hoàn toàn. – notnoop
Hawtin == smrt. – orbfish
ví dụ biên dịch trong javac 7 – irreputable