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
Alert はパラメータ化する必要があるため、行 50 に rawtype 警告があることに注意してください。これを行うと、たとえば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 )