java - 如何为具有未确定的 "?"值类型的 Java 通用映射添加值

标签 java dictionary generics types

我在 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/

相关文章:

java - 如何在没有 IDE 帮助的情况下导入 Maven 2 项目

java - 如何在 JTable 中显示双向链表数据?

c# - 间接引用声明具有类型限制的泛型扩展方法的程序集时出现奇怪的编译错误

java - 正则表达式匹配特定字符串或数字

java - 什么可以用来限制 java 卡片布局中面板之间的导航?

java - 获取内部 JSON 数组值

python - 消除 ',' .join() 调用生成的双引号

python - python 关联文件中的项目

c# - 如何修复此错误?无效方差 : The type parameter 'T' must be invariantly valid on

java - 如何在没有明确指定其参数的情况下返回泛​​型类型?