java泛型和addAll方法

java泛型和addAll方法,java,generics,collections,Java,Generics,Collections,Java集合中addAll(..)方法的正确参数类型是什么?如果我这样做: List<? extends Map<String, Object[]>> currentList = new ArrayList<Map<String, Object[]>>(); Collection<HashMap<String, Object[]>> addAll = new ArrayList<HashMap<String, O

Java集合中addAll(..)方法的正确参数类型是什么?如果我这样做:

List<? extends Map<String, Object[]>> currentList = new ArrayList<Map<String, Object[]>>();
Collection<HashMap<String, Object[]>> addAll = new ArrayList<HashMap<String, Object[]>>();
// add some hashmaps to the list..
currentList.addAll(addAll); 

List你的问题基本上可以归结为:

public static <T extends Collection<?>> void foo(T t) {
T x = null;
x.addAll(t);
}

publicstatic您不能在这样的列表中调用任何具有泛型属性的方法。基本上,什么是
?extends Foo
说的是“扩展
Foo
的东西”,但你不知道那东西是什么。当返回该类型时,可以说返回的值是
Foo
或某个子类型。但是对于任何给定的值,您都无法确定它是否匹配
?扩展Foo
generic


简言之:您需要更改
currentList
声明或将其强制转换为
List
(不带泛型),并使用警告或(如果您知道正在执行的操作)抑制它。

替换
通过
super
扩展

addAll()?扩展T
参数,当
T
时,该参数将不起作用?扩展地图
。随着更改,它将变得有效
?延伸?超级地图

但是,更好的方法是删除
?扩展
(或
?超级
)。在这种情况下这是多余的。只需使用
列表
addAll()
将有效地执行
?扩展地图>

请记住:


对于
,您只能将
T
的实例插入到
列表中


类型
列表您可以编辑以显示“currentList”和“newElements”的声明吗?我认为“newElements”应该是“addAll”,我已经修复了代码。为什么还要将
currentList
声明为
List@matt:这也是我在最后一段中说的:)
public static <T extends Collection<?>> void foo(T t) {
T x = null;
x.addAll(t);
}
public static <T extends Collection<Y>, Y> void foo(T t) {
T x = null;
x.addAll(t);
}
List<? extends Map<String, Object[]>> currentList;
List<Map<String, Object[]>> currentList;
List<Map<String, Object[]>> currentList;
List<? super Map<String, Object[]>> currentList;
currentList = new ArrayList<Map<? super String, ? extends Object[]>>();