5

このコードスニペットを考えると

    //Creates a list of List numbers
    List<List<Number>> num = new ArrayList<List<Number>>();
    //Creates a list of List doubles
    List<List<Double>> doub = new ArrayList<List<Double>>();
    //List of doubles
    List<Double> d = new ArrayList<Double>();
    d.add(2.5);
    d.add(2.6);
    doub.add(d);

    num.add(d);//This code will not compile

num.add(doub) が許可されないのはなぜですか? List<List<Number>>のスーパータイプで はありませんList<List<Double>>か?

4

4 に答える 4

6

ジェネリックスの継承は、私たちの継承の理解と少し違います。サブクラス型を使用する場合は、ジェネリックで extends (または) super を使用して境界 (ワイルドカード) を定義する必要があります。

ここに画像の説明を入力

于 2012-08-30T14:51:06.193 に答える
1

リストを取るリストにリストのリストを追加しようとしています。(編集後ではありません)

または、少し混乱が少ないかもしれません:

Your num list can only add List<Number>, you are trying to add a List<List<Double>>.

また、ジェネリックを使用した継承はそのようには機能しません。double の List を追加したとしても、機能しません。

num を次のように定義すると、次のようになります。

    List<List<? extends Number>> num = new ArrayList<List<? extends Number>>();

次に、これを行うことができます。

    num.add(d);

だがしかし:

    num.add(doub);
于 2012-08-30T14:53:04.820 に答える
0

List<Double>List<Number>Compilreがその部分に関する限り、何の関係もありませんList<>

したがって、これらは Java Generics システムによる 2 つの完全に異なる型List<List<Double>>から継承されません。List<List<Number>>これは、extendsクラスを構築するときのような関係ではありません。

于 2012-08-30T14:53:13.747 に答える
0

宣言された型を考えると、 の一貫性のない動作を意味しdoub.add(d)ます。機能する場合、私も同様に期待することはありません。num.add(doub)add()doub.add(d)num.add(doub)

もしかしてテストするつもりだったの?

num.add(d)

それ以外の

num.add(doub)

?

于 2012-08-30T15:01:21.587 に答える