【问题标题】:Java wildcards don't allow type-castingJava 通配符不允许类型转换
【发布时间】:2012-10-16 12:10:31
【问题描述】:
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 &lt; anonymous Message&lt; Integer, MainFoo &gt;&gt; cannot be converted to Message&lt; Integer, Foo&lt; ?&gt;&gt; by method invocation conversion

为什么?

还有什么可以转换成Message> ?

【问题讨论】:

    标签: java generics wildcard upcasting


    【解决方案1】:

    你应该使用&lt;? extends Foo&lt;?&gt;&gt;

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

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

    【讨论】:

    • 哦,一个双通配符。成功了,谢谢!另外,我怀疑 PECS 是否适用于此。
    • 我刚刚提到了 PECS,因为它值得牢记,我将编辑答案以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 2016-07-12
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多