0
class Aliphatic<F> extends Organic<F>{}
class Hexane<G> extends Aliphatic<G>{}
public class Organic<E>{
    void react(E e){}
    static void main(String[] args){
        Organic<? extends Organic> compound = new Aliphatic<Organic>();
        compound.react(new Organic());
    }
}

Organic引数でreactメソッドを呼び出せないのはなぜですか? 参照<? extends Organic>のジェネリック型は、インスタンス化のジェネリック型が Organic または Organic のサブタイプのいずれかであると述べています。

コンパイラは、ランタイム型までこのインスタンス化ジェネリック型を認識していないため、ジェネリック基準に値をバインドしませんか?

なぜこのケースが機能するのですか?この場合も同じですか?

public class WildcardCollection {
    public static void main (String[] args){
        WildcardCollection w = new WildcardCollection();
        w.myMethod(new Items("hola",1));     //Compile
        w.myMethod(new SubItems("nuevo",3)); //Compile
    }
    public <T extends Items> void myMethod(T a){ //Same as above
        System.out.println("hi: "+a);
    }
}
class SubItems extends Items {
    SubItems(){};
    SubItems(String s, int i){ super(s,i);}
}
class Items implements Comparable<Items> {
    private String name;
    private int value;

    public Items() {}

    public Items(String n, int i){ this.name = n; this.value = i;}
    public String getName(){ return this.name;}
    public int getValue(){ return this.value;}

    public String toString(){ return "(" + this.name + "-" + this.value + ")";}

    public int compareTo(Items i){
        return this.value - i.getValue();
    }
}
4

1 に答える 1

2

簡単に言えばT、ワイルドカードでインスタンス化された型パラメーターを持つジェネリック型のオブジェクトがある場合、コンパイラーは型の安全性を保証できないため、? extends X型のパラメーターを受け取るオブジェクトでメソッドを呼び出すことはできません。Tただし、返すメソッドを呼び出す(および戻り値を type の変数に割り当てる) ことはできます。あなたの特定の例では、これは安全であるように見えますTX

Organic<? extends Organic> compound = new Aliphatic<Organic>();
compound.react(new Organic());

ただし、コンパイラは宣言タイプ ( ) にreact基づいて呼び出しを一致させる必要があることに注意してください。RHS に割り当てたものに依存することはできません。コンパイラがこれを許可した場合、それも許可する必要があります? extends Organic

Organic<? extends Organic> compound = new Aliphatic<Hexane<?>>();
compound.react(new Organic());

これは明らかに正しくありません - とまったく同じ状況です

Collection<? extends Number> nums = new ArrayList<Float>();
nums.add(Integer.valueOf(1));

(これはすべて、ジェネリックであるため、単なる ではなく、または同様のOrganicことを言う必要があるという事実は別として)Organic<? extends Organic<?>>Organic<? extends Organic>

于 2012-10-15T15:39:18.157 に答える