3
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< Integer, Foo< ?>> に変換できるものは何ですか?

4

1 に答える 1

10

あなたは使用する必要があります<? extends Foo<?>>

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

また、ジェネリックスを扱うときに覚えておく価値のあることは、PECSルールです。プロデューサーエクステンド、コンシューマースーパーはここに直接属していませんが、ここにまったく属していないとは言えません。

于 2012-10-16T12:14:04.003 に答える