我有一个抽象类,如下所示:
abstract class Handler<T> {
Handler(Class<T> clazz) {
// ...
}
abstract void handle(T object);
}
我正在try 扩展它,其中T
是带有通配符泛型参数的类型(出于示例的目的,假设为List<?>
).我希望能够做的事情是:
class MyHandler extends Handler<List<?>> {
MyHandler() {
super(List.class);
// ^ Compiler error: The constructor Handler<List<?>>(Class<List>) is undefined
// super(List<?>.class); is also a compiler error
}
void handle(List<?> object) {
// ...
}
}
据我所知,上面的代码是完全安全的,所以我不确定为什么编译器不允许它.我目前的解决方案涉及使用原始类型、不安全的强制转换和隐藏警告,似乎不能成为语言让我使用的解决方案:
class MyHandler extends Handler<List> { // Warning: List is a raw type
MyHandler() {
super(List.class);
}
void handle(List objectRaw) { // Warning: List is a raw type
List<?> object = (List<?>) objectRaw;
// ...
}
}
这需要是一个单例,所以我不能将泛型参数添加到MyHandler
.如何避免所有这些糟糕的做法(原始类型和强制转换)?这没有理由不安全,我很难相信在Java中没有办法做到这一点.