Java 为什么此转换无效?
我想使用具有各种列表作为值的映射:Java 为什么此转换无效?,java,Java,我想使用具有各种列表作为值的映射: Map<String, List<Integer>> ml; Map<String, ?> ml2 = ml; // OK Map<String, List<?>> ml3 = ml; // Type mismatch Map-ml; 映射ml2=ml;//好啊 Map它无效,因为如果它有效,您也可以将非整数列表添加到ml 示例(无效): Map-ml; Map ml2=ml有效?这是因为使用通配符
Map<String, List<Integer>> ml;
Map<String, ?> ml2 = ml; // OK
Map<String, List<?>> ml3 = ml; // Type mismatch
Map-ml;
映射ml2=ml;//好啊
Map它无效,因为如果它有效,您也可以将非整数列表添加到ml
示例(无效):
Map-ml;
Map ml2=ml代码>有效?这是因为使用通配符告诉编译器不允许添加新元素,即ml2.put(“strings”,Arrays.asList(“evil”,“string”)不允许使用代码>(编译器不进行类型检查,它只看到通配符,并且知道您不能调用该方法。Map
将字符串映射到任何对象,整数列表可以与此通配符匹配。但是,整数列表与?(任何对象的列表)列表不匹配,因为整型列表只能接受整型对象。AMapI认为最好能解释为什么中间线转换在这种情况下会成功(并表明您无法通过该引用将任何内容放入其中,因此它是安全的)。此外,它是ml3.put,但是ml3.add;)@ArturBiesiadowski是的,修复了错误并添加了解释:)谢谢,我没有发现这个问题。注意,仍然可以向映射添加元素,但唯一可以添加的值是null
(如果映射支持null值)。
Map<String, List<Integer>> ml;
Map<String, List<?>> ml3 = ml;
ml3.put("strings", Arrays.asList("evil","string"));
List<Integer> l = ml.get("strings"); //see how this is going to fail?