9

我有一个泛型类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<?>总而言之,它与和 raw type的区别有关Foo

更新:

Grep无界通配符参数化类型和原始类型有什么区别?此链接上可能会有所帮助。

4

2 回答 2

8

List表示没有类型参数的列表。它是一个列表,其元素可以是任何类型,例如元素可以是不同的类型。它与 基本相同List<Object>

同时,List<?>表示具有无界类型参数的列表。它的元素是特定但未知的(在运行时之前)类型。这些元素在运行时都必须来自同一类型。

我建议避免使用原始类型。您的示例的正确解决方案是List<Foo<?>>.

于 2013-06-30T16:10:18.837 回答
4

您希望尽可能避免使用原始类型。正确的做法是使用
List<Foo<?>>.

于 2013-06-30T16:10:05.750 回答