无法使用通配符调用泛型方法

时间:2009-06-21 21:37:56

标签: java generics

我有一个如此定义的类:

public class Test {
    static <T> List<Class<T>> filter(List<Class<T>> input) {
        // code here
    }

    public static void main(String[] args) {
        List<Class<? extends Throwable>> list =
            new ArrayList<Class<? extends Throwable>>();
        filter(list);
    }
}

filter中的main方法调用会产生以下编译错误:

The method filter(List<Class<T>>) in the type Test is not applicable for the
arguments (List<Class<? extends Throwable>>)

我不明白为什么<T>没有绑定到<? extends Throwable>。有没有可以帮助我的仿制药大师?

3 个答案:

答案 0 :(得分:4)

啊,通用签名的乐趣。

您可以通过将参数声明为:

来修复它
static <T> List<Class<T>> filter(List<Class<? extends T>> input) {
    // code here
}

至于为什么,我不确定。通过尝试各种事情直到红线消失,修复了泛型编译问题太多。不满意。

答案 1 :(得分:4)

我认为这里的问题是?没有类型可以做。

考虑一下,为简单起见,我们是否将Class替换为AtomicReference

static <T> void filter(List<AtomicReference<T>> input) {
    T value = input.get(0).get();
    input.get(1).set(value);
}

如果inputAtomicReference<Integer>AtomicReference<String>组成,我们就会遇到麻烦。

存在多态性时指向指针的基本问题很难。如果没有泛型,我们可以直接挥手。对于泛型,我们需要实际意味着什么。

答案 2 :(得分:0)