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;
// }
}
在 OpenJDK6 上编译良好,但在 OpenJDK7 中给出:
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
请注意,第 50 行有 rawtype 警告,因为必须对 Alert 进行参数化。如果我这样做,例如extends BaseController<Alert<Object>>
,代码编译。但我不能这样做,因为我需要实现 getModelClass()。
更新:这是 Java 6 实现中的一个错误,已在 Java 7 中修复:http ://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6559182 。(这是我对编译器开发人员的问题: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 )