以下是令我困惑的代码示例。
如果我尝试创建一个有界类型的集合并将同一个变量分配给另一个无限未知类型集合的另一个变量,则该代码可以正常工作。
List<? extends Number> numberList = new ArrayList<>();
List<?> anotherList = numberList; // OK
如果我尝试在Map中执行相同操作,则会出现“不兼容类型”错误。
Map<String, List<? extends Number>> numberMap = new HashMap<>();
Map<String, List<?>> anotherMap = numberMap; // ERROR
错误说:
Map<String,List<? extends Number>> cannot be converted to Map<String,List<?>>
Map<String,List<? extends Number>>
不是Map<String,List<?>>
的类型吗?
为方便起见,这是全班[{3}}
我试图理解为什么这不起作用,我应该如何改变它才能使它发挥作用。
答案 0 :(得分:2)
仅仅因为List<? extends Number>
是List<?>
的子类型并不意味着Map<String, List<? extends Number>>
是Map<String, List<?>>
的子类型,原因与{{1}相同}}不是List<Number>
的子类型 - Java的泛型是不变的。
要使List<?>
成为List<Number>
的子类型,您必须添加带有边界的通配符。此处的解决方案相同 - 将List<?>
添加到? extends
。
List<?>