java泛型和addAll方法
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
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[]>>();