我有一张如下图所示的地图
final Map<String, ? extends Object> map
任何人都可以告诉我为什么不能进行此操作..?
productMap.put("min", String.valueof(34));
转变应该是什么......
答案 0 :(得分:4)
你不能向Map添加任何对象,因为编译器知道值是某个扩展Object的类,但不知道哪一个。
Map<String, ? extends Object> map = new HashMap<String, Integer>();
Object val = map.get("min"); // this is ok.
map.put("min", Integer.toString(34)); // not allowed.
相反,您可以使用
Map<String, Object> map = new HashMap<String, Object>();
Object val = map.get("min"); // this is ok.
map.put("min", Integer.toString(34)); // is ok.
答案 1 :(得分:3)
通配符提供了灵活性(您现在可以将HashMap<String, String>
或HashMap<String, Integer>
分配给map
)以换取条件:您无法写入map
,因为它不知道值的实际类别是什么。
有关优秀教程,请参阅here。
答案 2 :(得分:2)
您告诉编译器,地图值将是Object的某个特定子类型。 ?可能是任何事情 - 你可以这样做:
Map<String,? extends Object> map = new HashMap<String,Integer>();
所以String可能无效。
您可能想要更简单的Map,它允许任何值。
或者你可以&#34;作弊&#34;并做一个隐藏泛型类型的演员:
((Map)productMap).put("min", String.valueof(34));
但这个伎俩不是最佳做法&amp;如果有的话,要谨慎使用。
答案 3 :(得分:1)
通过将地图声明为Map<String, ? extends Object>
,您声明第二种类型是“从对象继承的任何内容”。这相当于将地图声明为Map<String, ?>
。此声明允许分配
final Map<String, ? extends Object> map = new HashMap<String, Integer>();
我认为这个例子清楚地说明了为什么编译器禁止在字符串中插入字符串:声明中未指定值类型。