我有一个通用类Foo<T>
和参数化类型Foo<String>
和Foo<Integer>
。现在我想将不同的参数化类型放入单个ArrayList
中。这样做的正确方法是什么?
候选人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上的无界通配符参数化类型和原始类型之间有什么区别?可能会有所帮助。
答案 0 :(得分:8)
List
表示没有类型参数的列表。它是一个列表,其元素是任何类型的,例如,元素可以是不同类型的。它与List<Object>
基本相同。
同时,List<?>
表示具有无界类型参数的列表。它的元素是特定的,但未知(在运行时之前)类型。这些元素都必须在运行时来自同一类型。
我建议避免使用原始类型。您的示例的正确解决方案是List<Foo<?>>
。
答案 1 :(得分:4)
您希望尽可能避免使用原始类型。正确的方法是使用List<Foo<?>>
。