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行有一个原始类型警告,因为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)
extends BaseController<Alert<?>>
,会发生什么?(此外,错误消息抱怨Controller extends...
,但您发布的代码是AlertController extends...
。您确定您有正确的行吗?) - Ted HoppAlert<?>
进行参数化,我就无法实现getModelClass()
。直到 Paul Bellora 建议将Class<Alert>
强制转换为Class<Alert<?>>
的巧妙技巧后,我才能够实现它。 @PaulBellora 不是我想的出这个技巧,感谢你的帮助! - Dzmitry Lazerka