2013-06-30 62 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<?>表示具有無限類型參數的列表。它的元素是特定的,但未知(運行時之前)類型。這些元素都必須在Runtime中來自相同的類型。

我建議避免使用原始類型。你的例子適合的解決方案是List<Foo<?>>

4

您希望儘可能避免原始類型。正確的方法是使用
List<Foo<?>>