【问题标题】:why i can't create a Map of String and generic object为什么我不能创建字符串和通用对象的映射
【发布时间】:2011-08-05 09:54:28
【问题描述】:

我正在尝试做这样的事情

  final Map<String, ? extends Object> params = new HashMap<String, ? extends Object>();

但是 java 编译器抱怨“无法实例化类型 HashMap();

这是怎么回事..?

【问题讨论】:

标签: java generics map hashmap


【解决方案1】:

? extends Object 是通配符。它代表“某种未知类型,我们唯一知道的是它是Object 的子类型”。在声明中很好,但你不能实例化它,因为它不是一个实际的类型。试试

final Map<String, ? extends Object> params = new HashMap<String, Object>();

因为你不知道? 是什么类型,所以你不能给它分配任何东西。由于Object 是所有事物的超类型,因此可以为params 分配对HashMap&lt;String, Integer&gt;HashMap&lt;String, String&gt; 的引用,等等。 String 不是 IntegerInteger 也不是 String。编译器无法知道params 可能是哪个params,因此在params 中放入任何内容都不是有效操作。

如果您希望能够将 &lt;String, String&gt; 放入 params 中,请这样声明。例如,

final Map<String, Object> params = new HashMap<String, Object>();
params.put("a", "blah");

有关该主题的良好介绍,请查看有关泛型的 Java 语言教程,尤其是。 this page 和它之后的那个。

【讨论】:

  • 但是如果我想存储怎么办
  • @Saurabh 这可以正常工作,因为 String 类(与几乎所有类一样)是 Object 的子类。如果您想在 HashMap 中存储绝对任何类的实例,则此实现工作正常。有关您实际尝试实现的目标的一些详细信息可能会帮助我们确定这是否是正确的方法。
  • 我很想知道为什么final Map&lt;String, Object&gt; params = Collections.&lt;String, Object&gt;emptyMap(); 不起作用。尝试放置 &lt;String,String&gt; 时抛出 UnsupportedOperationException
  • 另外,IntelliJ(在 Java 14 中)建议使用 Map&lt;String, ?&gt; 而不是 Map&lt;String, ? extends Object&gt;...
【解决方案2】:
? extends Object

不计算任何类型。所以你不能那样说。 1. 如果你想要 AnyType 扩展 Object,那你为什么不简单地传递 Object。 因为扩展 Object 的 anyType 也是一个 Object。默认情况下,每个 Java 类 Type 都扩展 Object。 2.如果你想明确TypeA扩展TypeB, 那么你就可以这样做了

Map<String, TypeB>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多