我想使用带有各种列表的地图作为值:
Map<String, List<Integer>> ml;
Map<String, ?> ml2 = ml; // OK
Map<String, List<?>> ml3 = ml; // Type mismatch
为什么最后一行无效?
答案 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, ?>
会将字符串映射到任何对象,可以通过此通配符匹配整数列表。但是,整数列表与列表不匹配? (任何对象的列表),因为整数列表只能采用整数对象。