带通配符的嵌套泛型

时间:2009-08-27 13:27:03

标签: java generics

为什么这样做:

List<?> list = new LinkedList<Integer>();

虽然这会产生类型不匹配错误:

List<List<?>> list = new LinkedList<List<Integer>>();

这是为什么? 如果不使用原始类型,是不是有办法解决这个问题?

5 个答案:

答案 0 :(得分:4)

尝试

List<? extends List<?>> list = new LinkedList<List<Integer>>();

注意:您应该知道,当您使用像List这样的集合时,您只能在“只读”模式下使用它(除了添加空值)。

答案 1 :(得分:3)

要真正回答你的问题:

在第一种情况下,“list”包含一个特定的未指定类型的列表 - 在本例中为Integer。

在第二种情况下,“list”包含列表列表,但每个子列表可以是任何特定类型,但以下内容完全正常(请注意添加的两个列表的类型):

List<List<?>> list = new LinkedList<List<?>>();
list.add(new LinkedList<Integer>());
list.add(new LinkedList<Double>());

这与你无法做到的原因非常相似

List<Object> listO = new List<Number>();

有些操作在您的列表列表中完全有效吗?这在整数列表列表中是非法的。

为了做你想做的事情(有一个列表列表,所有子列表都是特定类型的唯一列表),我认为Zed的答案与你得到的一样接近。

答案 2 :(得分:0)

解决这个问题的方法是

List<List<?>> list = new LinkedList<List<?>>();

你也没有真正失去任何东西 - 你的Integer规范在任何地方都没有用,因为list将内部列表定义为使用?

答案 3 :(得分:0)

使用,

List<?> list1 = new LinkedList<List<Integer>>();

答案 4 :(得分:0)

我知道这是和帖子,但我似乎没有解决c0d3x问题的答案。

如果你这样做

List<List<?>> list = new LinkedList<List<?>>();

他如何为外部列表中的每个内部整数列表调用此方法?

public void doSomeThingWithAIntegerList(List<Integer> list){
    for(Integer i : list){
        // use it for some purpose
    }
}