Java通配符不允许类型转换

时间:2012-10-16 12:10:31

标签: java generics wildcard upcasting

interface Message<T, L> {
}

interface Foo<T> {
    void frob(Message<T, Foo<?>> message);
}

class AuxiliaryFoo implements Foo<Integer> {
    @Override
    public void frob(Message<Integer, Foo<?>> message) { }
}

class MainFoo implements Foo<Object> {
    @Override
    public void frob(Message<Object, Foo<?>> message) {
        new AuxiliaryFoo().frob(new Message<Integer, MainFoo>() {});
    }
}

Java编译器告诉我actual argument < anonymous Message< Integer, MainFoo >> cannot be converted to Message< Integer, Foo< ?>> by method invocation conversion

为什么呢?

什么可以转换为Message&lt;整数,Foo&lt; ?&GT;&GT; ?

1 个答案:

答案 0 :(得分:8)

您应该使用<? extends Foo<?>>

interface Foo<T> {     
    void frob(Message<T, ? extends Foo<?>> message); 
} 

此外,在处理泛型时值得记住的是PECS规则:Producer Extends, Consumer Super虽然它不直接属于这里,但我不能说它根本不属于这里。