2011-07-20 4 views
0

:)不明なタイプの汎用コンテナに汎用値を追加すると、ケージに動物を追加する方法はありますか?

public class Cage<T> extends ArrayList<T> { 
    public final String name = "foo"; 
} 

public Zoo { 
    List<? extends Cage<?>> zooCages= new ArrayList<Cage<?>>(); 

    public <T> void addAnimal(String name, T animal){ 
      for(Cage<?> c : zooCages) 
       if(c.name.equals(name)){ 
        c.add(animal);  //compile error 
        return; 
       } 
    } 
} 

EDIT:タイプミス。 EDIT 2:

+0

これは、Cageとそのaddメソッドの宣言によります。それは単にコレクションのサブクラスですか? – Affe

+0

1行目のコンストラクタ呼び出しのカッコがなくなり、 'c.add(animal)'の後にセミコロンが付きます。 –

答えて

1

問題は、無制限のワイルドカードを使用することです。次の例を参照してください:

Cage<?> cage1 = new Cage<Integer>(); 
Cage<?> cage2 = new Cage<String>(); 
Cage<?> cage3 = new Cage<T>(); 

someMethod(cage1); 
someMethod(cage2); 
someMethod(cage3); 

public void someMethod(Cage<?> cage) { 
    cage.add(1);    // Will not compile 
    cage.add("A String");  // Will not compile 
    cage.add(someValueOfTypeT); // Will not compile 
} 

技術的には、この方法は、厳密には必要ありませんでしたが、あなたは簡単にこのコードの問題を見ることができます。 Cage<?>は、Cage<String>またはCage<Anything>とすることができます。特定のCageになる可能性があるため、何も追加できません。

CageTを追加する場合は、Cage<T>またはCage<? super T>である必要があります。これを行う方法の1つは次のとおりです。

public class Zoo<T> { 
    private List<? extends Cage<? super T>> cages = new ArrayList<>(); 

    public void addAnimal(String cageName, T animal) { 
    for(Cage<? super T> cage : cages) { 
     // Now you can add animal to a cage 
    } 
    } 
} 
2

例を完了(私はCageコレクションであると仮定しています。)

あなたがここに概念的なエラーが発生しています。

cは、foreachループでCage<?>として宣言されています。つまり、指定されていないタイプを受け入れるかごです。タイプTのオブジェクトを追加しようとしていますが、cにはタイプTのオブジェクトが含まれているとは考えられません。

ワイルドカード*の意味については、http://download.oracle.com/javase/tutorial/java/generics/wildcards.htmlを参照してください。

おそらく、クラス内のすべてのケージに同じ(任意の)タイプTを含めることをお勧めします。この場合、囲むクラス全体が型パラメータをとる必要があります。例:

import java.util.*; 

public class Main<T> { 
    private class Cage extends ArrayList<T> { 
     public final String name = "foo"; 
    } 

    List<? extends Cage> zooCages = new ArrayList<Cage>(); 

    public void addAnimal(String name, T animal) { 
     for(Cage c : zooCages) { 
      if(c.name.equals(name)) { 
       c.add(animal); 
       return; 
      } 
     } 
    } 
} 
+0

ありがとうございました、上記の完全な例を参照してください、 – user853080

関連する問題