在this问题中,我看到我可以使用辅助方法捕获'将通配符泛型转换为类型T来进行类型安全操作,如下所示:
void foo(List<?> i) {
fooHelper(i);
}
private <T> void fooHelper(List<T> l) {
l.set(0, l.get(0));
}
但是,当我尝试使用extends
关键字进行此操作时,它无法正常工作:
void bar() {
barHelper(String.class); //works fine
}
void bar(Class<? extends Comparable<?>> clazz) {
barHelper(clazz); //doesn't compile
}
<T> void barHelper(Class<? extends Comparable<T>> clazz) { }
我收到以下错误:
The method fooHelper
(Class<? extends Comparable<T>>)
in the type Test is not applicable for the arguments
(Class<capture#1-of ? extends Comparable<?>>)
使用extends
关键字时,有没有办法捕获通配符?
我的背景是,我有一个扩展给定类A的类列表,每个类都有一个不同的泛型参数T.对于每个类,我想获得对它的T类的引用,我正在尝试这样做是安全的。
答案 0 :(得分:2)
我认为通用约束必须是声明类型参数<T>
的地方,因此不是
<T> void barHelper(Class<? extends Comparable<T>> clazz) { }
我会写
<A, B extends A> void barHelper(Class<B> clazz) { }
或者如果知道超级/顶级类
<T extends MySuperType> void barHelper(Class<T> clazz) { }