如何为带有未确定的“?”的Java通用Map添加值值类型?

2024-05-26

我在 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(使用前将#替换为@)

如何为带有未确定的“?”的Java通用Map添加值值类型? 的相关文章

随机推荐