2013-06-30 4 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.

Update:

Grep В чем разница между неограниченным подстановочным параметризованным типом и необработанным типом? на this link может быть полезно.

ответ

8

List представляет собой список без параметра типа. Это список, элементы которого имеют любой тип, например. элементы могут быть разных типов. Это в основном то же самое, что и List<Object>.

Между тем, List<?> представляет собой список с параметром неограниченного типа. Его элементы имеют определенный, но неизвестный (до выполнения) тип. Эти элементы должны быть одного типа во время выполнения.

Я рекомендую избегать использования необработанных типов. Правильное решение для вашего примера - List<Foo<?>>.

4

Вы хотите избежать необработанных типов, когда это возможно. Правильный способ сделать это будет с
List<Foo<?>>.

Смежные вопросы