class HasId<I> {}
class HasStringId extends HasId<String> {}
class Alert<T extends /*Some*/Object> extends HasStringId {}
class BaseController<M extends HasId<String>> {
// abstract Class<M> getModelClass();
}
class AlertController extends BaseController<Alert> { // error here
// @Override Class<Alert> getModelClass() {
// return Alert.class;
// }
}
biên dịch tốt trên OpenJDK6, nhưng trong OpenJDK7 cho:Tại sao những Generics không biên dịch trong OpenJDK7, nhưng làm trong OpenJDK6
AlertController.java:50: error: type argument Alert is not within bounds of
type-variable T
class AlertController extends BaseController<Alert> {
^
where T is a type-variable:
T extends HasId<String> declared in class BaseController
Lưu ý rằng có cảnh báo rawtype tại dòng 50, vì Alert phải được tham số hóa. Nếu tôi làm điều đó, ví dụ: extends BaseController<Alert<Object>>
, biên dịch mã. Nhưng tôi không thể làm điều đó, bởi vì tôi cần phải thực hiện getModelClass().
CẬP NHẬT: Đó là lỗi trong triển khai Java 6, được sửa trong Java 7: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6559182. (Và đây là câu hỏi của tôi cho các nhà phát triển trình biên dịch: http://openjdk.5641.n7.nabble.com/Nested-generics-don-t-compile-in-1-7-0-15-but-do-in-1-6-0-27-td121820.html)
Điều gì sẽ xảy ra nếu bạn tham số hóa nó là 'mở rộng BaseController> '? (Ngoài ra, thông báo lỗi phàn nàn về 'Điều khiển mở rộng ...', nhưng mã đã đăng của bạn là 'AlertController extends ...'. Bạn có chắc chắn rằng bạn có đúng dòng không?) –
Tại sao có một downvote? –
@TedHopp Nếu tôi tham số hóa với 'Alert >', tôi không thể triển khai 'getModelClass()'. Không thể, cho đến khi Paul Bellora đề xuất một mẹo hay để đúc Lớp đến Lớp >. @PaulBellora không phải là tôi. Cảm ơn bạn đã lừa! –