【问题标题】:Why difference in behavior with Set<Objects> and Map<Object,Object>为什么 Set<Objects> 和 Map<Object,Object> 的行为不同
【发布时间】:2015-07-04 15:20:22
【问题描述】:
Line 1 :      Set<Object> singletons = new HashSet<Object>();
Line 2 :      singletons.add(new Integer(2));
Line 3 :      Map<String, Object> myMap = new HashMap<String, String>();

为什么编译器在第 3 行报错而在第 2 行不报错?

【问题讨论】:

  • 您在哪里看到地图和集合之间的行为差​​异?在这两种情况下,您根本没有做同样的事情。 Integer 可隐式转换为 ObjectHashMap&lt;String, String&gt; 不能隐式转换为 Map&lt;String, Object&gt;
  • 泛型的工作方式不同。如果你把第一行改成new HashSet&lt;String&gt;()也会报错。
  • @Jon Integer 可隐式转换为 object 那么为什么 Map 不能转换为 Map ?毕竟 String 也只是 Object 。编译器试图通过引发错误来拯救我们吗?为什么这不会是 Set 的问题?
  • @Manish:这Set&lt;Object&gt; 的问题 - 尝试使用Set&lt;Object&gt; set = new HashSet&lt;String&gt;(); 你会发现问题。虽然IntegerObject 的子类型,但Map&lt;String, String&gt; 不是Map&lt;String, Object&gt; 的子类型。您可以将非字符串值放入 Map&lt;String, Object&gt; 例如...

标签: java data-structures


【解决方案1】:

作为mentioned in the comments,如果您将第一行更改为

Set<Object> singletons = new HashSet<String>();

你会得到同样的错误。这是因为HashSet&lt;String&gt;(甚至Set&lt;String&gt;)不是Set&lt;Object&gt; 的子类型。要了解原因,请考虑您将在该集合上调用的操作。您已经进行了一次调用以向其添加 Integer 对象。

singletons.add(new Integer(2));

这很好用,因为您将 singletons 实例化为 HashSet&lt;Object&gt;。如果您已将其实例化为 HashSet&lt;String&gt;,那么您将向 String 集合添加 Integer 对象,这是不允许的。

【讨论】:

    【解决方案2】:

    试一试

     Map<String, String> myMap = new HashMap<String, String>();
    

     Map<String, Object> myMap = new HashMap<String, Object>();
    

    但如果您使用 java 版本 >= 7,我会使用右侧的菱形运算符

     Map<String, String> myMap = new HashMap<>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2020-04-04
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 2016-06-16
      相关资源
      最近更新 更多