1

私は以下の2つのクラスを持っていました。オブジェクトがパラメーター化された型の数値にスーパーであるため、パラメーター化された型が (Node? super Number> s0) であるため、私の理解では、コンパイラーは 4 行目 (class WildCard) で文句を言ってはいけません。しかし、コンパイラは 4、8、および 9 で不平を言っています。

public class Node<E> {

    private E data;

    public void setData(E obj) {
        data = obj;
    }

    public E getData() {
        return data;
    }
}


public class WildCard {


    static void checkIt(Node<? super Number> s0)
    {
        Object object=new Object(); //1
        Number number =1.5; //2
        Integer integer=10; //3

        s0.setData(object); //4
        s0.setData(number); //5
        s0.setData(integer); //6

        object=s0.getData(); //7
        number=s0.getData(); //8
        integer=s0.getData(); //9
    }
}
4

2 に答える 2

5

問題は次のとおりです。

Node<? super Number>は、型またはスーパー型Nodeのパラメーターを使用して任意のものを渡すことができることを意味します。NumberObject

そのジェネリック パラメータの正確な型がわからないため、一部の操作は許可されません。

一部の行がコンパイルされ、一部の行がコンパイルされない理由の簡単な内訳を次に示します。

  • s0.setData(object);Node<Number>任意のオブジェクトを追加するだけではない可能性があるため、コンパイルされません
  • s0.setData(number);Numberパラメータのすべての可能なタイプに一致するため、コンパイルされます
  • s0.setData(integer);Integer拡張するためコンパイルされNumber、したがって上記の行が適用されます

  • object=s0.getData();すべてのデータ オブジェクトが拡張されるためObject、常にコンパイルされます。

  • number=s0.getData();を持っている可能性があるため、コンパイルされません。Node<Object>したがって、データオブジェクトは異なるタイプを持つ可能性があります (例: String)
  • integer=s0.getData(); 上記の行と同じ理由で、コンパイルされません
于 2012-05-09T16:38:24.867 に答える
0

Java 言語仕様には次のように書かれています。

ワイルドカードには、通常の型変数宣言と同様に、明示的な境界を指定できます。上限は次の構文で表されます。ここBで、 は境界です。

? extends B

メソッド シグネチャで宣言される通常の型変数とは異なり、ワイルドカードを使用する場合、型の推論は必要ありません。したがって、次の構文を使用して、ワイルドカードで下限を宣言することができます。ここBで、 は下限です。

? super B

Reference(T referent, ReferenceQueue<? super T> queue);

ここで、参照対象は、要素型が参照対象の型のスーパータイプである任意のキューに挿入できます。ワイルドカードの下限です。TT

于 2012-05-09T16:23:44.557 に答える