我在 JDK 8 示例中看到过这种声明:
Map<String, ?> map = new HashMap<>(3); // OK
但是当我试图增加价值时map
,我没有成功:
map.put("abc", Optional.of(5));
map.put("kk", "xyz");
两者都无法编译。我想知道:
1) 什么是?
表明在Map
上面的声明?
2)如何赋予这个值map
?
Map<String,?>
是一个抽象类型。如果变量具有此类型,它可以引用具有以下任何类型(和其他类型)的对象。
HashMap<String,Integer>
TreeMap<String,String>
HashMap<String,ArrayList<Boolean>>
TreeMap<String,Throwable>
显然,可能性基本上是无限的。如果您有这种类型的变量,您就知道它引用了一个映射,其键是String
,但你真的一无所知。特别是,当您执行以下操作时,您不知道最终会得到什么类型的对象get
在那Map
.
但更重要的是,你永远无法put
任何东西都可以进入地图,而不需要某种令人讨厌的、不安全的铸造操作。编译器会阻止你。所以在你给出的例子中 -
-
map.put("abc", Optional.of(5));
不会编译,因为map
可能是一个HashMap<String,String>
,你不能在其中放入Optional
.
-
map.put("kk", "xyz");
不会编译,因为map
可能是一个TreeMap<String,Integer>
,你不能在其中放入String
.
例外情况是null
,或来自地图本身的任何值 - 请参阅 Andy Turner 的出色答案,了解有关这些可能性的更多详细信息。
简而言之,如果你有一个类型的变量Map<String,?>
,编译器允许您对其执行的操作有点有限。你不能将任何东西放入地图中,除非它是null
或者它已经在地图中了。您所能做的就是从地图中获取值,并从地图中删除值。
所以使用一个Map<String,?>
变量是非常有限的。如果您只想从地图中读取值,那么这当然没问题。但不要期望能够将任意值插入到映射中,除非您使用不同的表达式来引用映射。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)