2013-06-30 18 views
8

私は汎用クラスFoo<T>とパラメータ化された型Foo<String>Foo<Integer>を持っています。ここでは、異なるパラメータ化された型を単一のArrayListに入れたいと思います。これを行う正しい方法は何ですか?javaの汎用型のコンテナ

候補1:

public class MMM { 
    public static void main(String[] args) { 
     Foo<String> fooString = new Foo<String>(); 
     Foo<Integer> fooInteger = new Foo<Integer>(); 

     ArrayList<Foo<?> > list = new ArrayList<Foo<?> >(); 
     list.add(fooString); 
     list.add(fooInteger); 

     for (Foo<?> foo : list) { 
      // Do something on foo. 
     } 
    } 
} 
class Foo<T> {} 

候補2:ワードで

public class MMM { 
    public static void main(String[] args) { 
     Foo<String> fooString = new Foo<String>(); 
     Foo<Integer> fooInteger = new Foo<Integer>(); 

     ArrayList<Foo> list = new ArrayList<Foo>(); 
     list.add(fooString); 
     list.add(fooInteger); 

     for (Foo foo : list) { 
      // Do something on foo. 
     } 
    } 
} 
class Foo<T> {} 

、それがFoo<?>と生型Fooとの間の差に関連しています。

更新:

Grepのアンバウンド形式のワイルドカードパラメータ化された型と生タイプの違いは何ですか?this linkに送信すると便利です。

答えて

8

Listは、タイプパラメータのないリストを表します。要素が任意の型のリストです。要素は異なるタイプであってもよい。基本的にはList<Object>と同じです。

一方、List<?>は、無制限タイプのパラメータを持つリストを表します。その要素は特定のものですが、(実行時の前に)型が不明です。これらの要素は、すべてランタイム時に同じタイプでなければなりません。

生の種類の使用を避けることをおすすめします。あなたの例のための適切な解決策はList<Foo<?>>です。

4

可能な限り生のタイプを避けたい。正しい方法は
List<Foo<?>>です。