2012-08-30 4 views
5

は、このコードスニペットコレクション内の型のサブクラスaを追加するのが不正なのはなぜですか?

//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<Double>>のスーパータイプはList<List<Number>>ではありませんか?

+1

num.add(doub)の代わりにnum.add(d)を意味しましたか? – Alex

+0

'? 'を許可しない限り、一般的な型は正確でなければなりません。サブタイプを拡張するか '?スーパースーパータイプ。 –

+0

コードを編集しました。彼は 'num.add(d)'を意味しました。そうでなければ、質問は面白くない! – romaintaz

答えて

6

Generics inheritanceは、私たちの継承の理解とは少し異なります。サブクラス型を使用する場合は、bounds(wildcards)をジェネリックスのextends(または)superを使用して定義する必要があります。

enter image description here

+0

あなたは私の例に関して私に例を教えてくれますか? – KyelJmD

+0

+1私はあなたの答えに画像を追加しました –

+0

私はこれをしますか?リスト<リスト<? Number>を拡張しますか? – KyelJmD

1

あなたはリストを取るリストにリストのリストを追加しようとしています。 (編集後、私は見ていない)

それとも少し少ない混乱:

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

また、ジェネリックと継承を使用すると、ダブルスの一覧を追加しなかった場合でも、それはないだろう、そのように動作しません。作業。

あなたはこのようなNUMを定義する場合:

num.add(d); 

ではなく:

num.add(doub); 
0

List<Double>は何も持っていない

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

は、その後、あなたがこれを行うことができるようになりますコンパイルがについて心配している限り、List<Number>としてください部。

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

0

doub.add(d)およびnum.add(doub)は、矛盾した動作がadd()であることを示しています。 doub.add(d)が動作する場合、私はnum.add(doub)も期待しません。あなたはおそらく

num.add(d) 

代わりの

num.add(doub) 

をテストするために

を意味しましたか?

関連する問題