为什么这种转换无效?

时间:2016-10-20 08:46:35

标签: java

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

Map<String, List<Integer>> ml;
Map<String, ?> ml2 = ml; // OK
Map<String, List<?>> ml3 = ml; // Type mismatch

为什么最后一行无效?

2 个答案:

答案 0 :(得分:7)

它无效,因为如果它有效,您也可以将非整数列表添加到public static byte[] Compress(string s) { var b = Encoding.UTF8.GetBytes(s); var ms = new MemoryStream(); using (GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress)) { zipStream.Write(b, 0, b.Length); zipStream.Flush(); //Doesn't seem like Close() is available in UWP, so I changed it to Flush(). Is this the problem? } // we create the data array here once the GZIP stream has been disposed var data = ms.ToArray(); ms.Dispose(); return data; }

示例(无效):

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? 有效?这是因为使用通配符告诉编译器不允许添加新元素,即不允许Map<String, ?> ml2 = ml;(编译器不进行类型检查,它只看到通配符和知道你不能称之为那种方法。

答案 1 :(得分:-1)

Map<String, ?>会将字符串映射到任何对象,可以通过此通配符匹配整数列表。但是,整数列表与列表不匹配? (任何对象的列表),因为整数列表只能采用整数对象。