为什么会发生这种情况?
List<Map<String, Object>> a, b;
a.addAll(b);
编译
但是
List<? extends Map<String, ?>> a, b;
a.addAll(b);
它不能编译。
如何使后者编译成功?
List<Map<String, Object>> a, b;
a.addAll(b);
编译
但是
List<? extends Map<String, ?>> a, b;
a.addAll(b);
它不能编译。
如何使后者编译成功?
CustomHashMap
继承自HashMap
,您可以按照以下方式初始化a
:List<CustomHashMap<String, String> list = new ArrayList<CustomHashMap<String, String>>();
List<? extends Map<String, ?>> a = list;
a
添加条目......a.add(new HashMap<String, String>());
如果你遇到这种奇怪的情况
CustomHashMap<String, String> map = list.get(0); // you would expect to get CustomHashMap object but you will get a HashMap object instead
static <T extends List<K>, V, K extends Map<String, V>> void addAllHelper(T from, T to) {
from.addAll(to);
}
`List extends Map> a;`
`List
- Pincha
中。 - DerMike? super
通配符定义,可以添加Collection。 - Prashant Bhate当您使用具体的泛型类型进行声明时,它会编译。如果您定义一个类:
public class AClass<T extends Map<String, ?>> {
public List<T> dostuff() {
List<T> lista = new ArrayList<T>();
List<T> listb = new ArrayList<T>();
lista.addAll(listb);
return lista;
}
}
使用通配符无法编译。
private <S extends Map<String, ?>> void method(List<S> a, List<S> b){
a.addAll(b);
}
List<? super Number>
a 被称为输出参数 out
,可用于更新
List<? extends Number> b
被称为输入参数 in
,可用于读取public static void main(String[] args) {
List<Integer> intList = new ArrayList<>();
List<Double> doubleList = new ArrayList<>();
List<Number> numberList = new ArrayList<>();
addAll(numberList, intList);
addAll(numberList, doubleList);
addAll(intList, doubleList);//cant add double to int
addAll(doubleList,intList);//cant add int double
addAll(intList, numberList);//cant add number to int
}
private static<T> void addAll(List<? super T> a, List<? extends T> b) {
a.addAll(b);
}
? extends Map<String, ?>
替换为扩展Map<String, Object>
的类型,因为在声明变量时需要给它们指定类型。如果没有指定类型,则需要像第一个示例中使用接口。 - LuigiEdlCarno