为什么这种转换无效?

jau*_*udo 2 java

我想使用带有各种列表的地图作为值:

Map<String, List<Integer>> ml;
Map<String, ?> ml2 = ml; // OK
Map<String, List<?>> ml3 = ml; // Type mismatch
Run Code Online (Sandbox Code Playgroud)

为什么最后一行无效?

Tho*_*mas 7

它无效,因为如果它有效,你也可以添加非整数列表ml.

示例(无效):

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?
Run Code Online (Sandbox Code Playgroud)

为什么Map<String, ?> ml2 = ml;有效?这是因为使用通配符告诉编译器不允许添加新元素,即ml2.put("strings", Arrays.asList("evil","string"));不允许(编译器不进行类型检查,它只是看到通配符并且知道你不能调用该方法.