class GenericCompilationFailureDemo {
List<? extends GenericCompilationFailureDemo> newList() {
return new ArrayList<GenericCompilationFailureDemo>();
};
void useList() {
List<GenericCompilationFailureDemo> list =
(List<GenericCompilationFailureDemo>) newList();
}
List<? extends Set<GenericCompilationFailureDemo>> newListOfSpecificSets() {
return new ArrayList<Set<GenericCompilationFailureDemo>>();
};
void useListOfSpecificSets() {
List<Set<GenericCompilationFailureDemo>> listOfSpecificSets =
(List<Set<GenericCompilationFailureDemo>>) newListOfSpecificSets();
}
List<? extends Set<? extends GenericCompilationFailureDemo>> newListOfSets() {
return new ArrayList<Set<? extends GenericCompilationFailureDemo>>();
};
void useListOfSet() {
List<Set<? extends GenericCompilationFailureDemo>> listOfSets =
(List<Set<? extends GenericCompilationFailureDemo>>) newListOfSets();
}
}
biên dịch dưới Sun JDK 1.6.0_20 (64-bit trên Windows Vista, nhưng tôi không nghĩ rằng làm cho bất kỳ sự khác biệt) nhưng gây ra sự thất bại biên soạn sau đây theo Oracle JDK 1.7.0_01 (giống nền tảng):
[ERROR] src\main\java\GenericCompilationFailureDemo.java:[56,78] error: inconvertible types
Lưu ý rằng người đầu tiên hai "kéo dài-to-cụ thể-loại" phôi trong useList
và useListOfSpecificSets
cả vẫn thành công dưới 1.7.0_01, vì vậy nó sẽ có vẻ nó là cái gì để làm với "đôi mở rộng chung".
Bất kỳ ý tưởng nào có thể đã thay đổi từ 6 đến 7 và liệu hành vi được quan sát có theo thông số hoặc lỗi không?
sửa để đáp ứng với bình luận Sanjay của:
@Sanjay: Aha, thú vị! Ở đây, sản lượng từ java -version
:
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Và đây là kết quả của javac GenericCompilationFailureDemo.java
(cùng một mã như trên với báo cáo nhập khẩu đối với List, ArrayList và Set):
GenericCompilationFailureDemo.java:30: error: inconvertible types
(List<Set<? extends GenericCompilationFailureDemo>>) newListOfSets()
;
^
required: List<Set<? extends GenericCompilationFailureDemo>>
found: List<CAP#1>
where CAP#1 is a fresh type-variable:
CAP#1 extends Set<? extends GenericCompilationFailureDemo> from capture of ?
extends Set<? extends GenericCompilationFailureDemo>
Note: GenericCompilationFailureDemo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
Đối với những gì nó có giá trị, mã này biên dịch trên JDK của tôi 7. Bạn có thể gửi toàn bộ sản lượng của 'java -version' lệnh cùng với "xây dựng " chuỗi? –
vui lòng dán các lỗi biên dịch chính xác + những gì sanjay đã đề xuất. * Tôi tin rằng các generics được cho là hơi đơn giản trong java 7 * trong một số trường hợp ... có thể bạn đã tìm thấy một trường hợp góc mà cú pháp cũ hơn, phức tạp, JDK 6 phá vỡ trình biên dịch mới. – jayunit100
@Sanjay: aha, thú vị! Xem câu hỏi đã chỉnh sửa để trả lời nhận xét của bạn –