Đây là một ví dụ trong thế giới thực từ API thư viện của bên thứ 3, nhưng được đơn giản hóa.
Được biên dịch với Oracle JDK 8u72
Hãy xem xét hai phương pháp sau:
<X extends CharSequence> X getCharSequence() {
return (X) "hello";
}
<X extends String> X getString() {
return (X) "hello";
}
Cả hai đều báo cáo cảnh báo "diễn viên không được kiểm tra" - tôi hiểu tại sao. Điều gây trở ngại cho tôi là tại sao tôi có thể gọi
Integer x = getCharSequence();
và nó biên dịch? Trình biên dịch nên biết rằng Integer
không thực hiện CharSequence
. Cuộc gọi đến
Integer y = getString();
đưa ra một lỗi (như mong đợi)
incompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String
Ai đó có thể giải thích tại sao hành vi này sẽ được coi là hợp lệ? Làm thế nào nó sẽ hữu ích?
Máy khách không biết rằng cuộc gọi này không an toàn - mã của máy khách sẽ biên dịch mà không có cảnh báo. Tại sao trình biên dịch không cảnh báo về điều đó / gây ra lỗi?
Ngoài ra, nó khác với ví dụ này như thế nào:
<X extends CharSequence> void doCharSequence(List<X> l) {
}
List<CharSequence> chsL = new ArrayList<>();
doCharSequence(chsL); // compiles
List<Integer> intL = new ArrayList<>();
doCharSequence(intL); // error
Cố gắng vượt qua List<Integer>
cho một lỗi, như mong đợi:
method doCharSequence in class generic.GenericTest cannot be applied to given types; required: java.util.List<X> found: java.util.List<java.lang.Integer> reason: inference variable X has incompatible bounds equality constraints: java.lang.Integer upper bounds: java.lang.CharSequence
Nếu đó là một lỗi, tại sao Integer x = getCharSequence();
không?
Integer x = getCharSequence();
sẽ biên dịch, nhưng truyền trên RHSInteger x = (Integer) getCharSequence();
không biên dịch được