Java Generics使用extends捕获通配符

时间:2014-08-26 16:08:11

标签: java generics wildcard type-safety

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类的引用,我正在尝试这样做是安全的。

1 个答案:

答案 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) { }