我在 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 中,没有某种讨厌的、不安全的类型转换操作。编译器会阻止你。所以在你给出的例子中 -
-
map.put("abc", Optional.of(5));
不会编译,因为map
可能是HashMap<String,String>
,你不能把Optional
. -
map.put("kk", "xyz");
不会编译,因为map
可能是TreeMap<String,Integer>
,你不能把String
.
异常(exception)情况是 null
,或来自 map 本身的任何值(value) - 有关这些可能性的更多详细信息,请参阅 Andy Turner 的出色回答。
简而言之,如果你有一个 Map<String,?>
类型的变量, 编译器让你对它做的操作有点受限。你不能在 map 上放任何东西,除非它是 null
或者它已经在 map 中。您所能做的就是从 map 中获取值,并从 map 中删除值。
所以使用 Map<String,?>
变量非常有限。如果您想对 map 做的只是从中读取值,那当然很好。但是不要指望能够将任意值插入到 map 中,除非您使用不同的表达式来引用 map 。
关于java - 如何为具有未确定的 "?"值类型的 Java 通用映射添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54086274/