【问题标题】:What is not valid in this assignment: `Map<String, Object> mObj = new HashMap<String, String[]>();`?在这个分配中什么是无效的:`Map<String, Object> mObj = new HashMap<String, String[]>();`?
【发布时间】:2015-12-16 13:10:36
【问题描述】:

在java中,这个赋值有什么问题:

Map<String, Object> mObj = new HashMap<String, String[]>();

我明白了:

error: incompatible types: HashMap<String,String[]> cannot be converted to Map<String,Object>

因为String[] 是Object,所以应该可以。 如果我像这样转换为未参数化的Map:Map&lt;String, Object&gt; mObj = (Map) new HashMap&lt;String, String[]&gt;();,它可以正常工作,但当然,我会收到警告并且它很脏。

此外,我觉得我的第一个任务应该可以工作。

谢谢!

PS:我不能简单地将new HashMap&lt;String, String[]&gt;(); 更改为new HashMap&lt;String, Object&gt;();,因为实际上,我调用了一个返回Map&lt;String, String[]&gt;(); 的方法,当然,我无法更改此方法。再次感谢。

【问题讨论】:

    标签: java dictionary compiler-errors parameterized incompatibletypeerror


    【解决方案1】:

    错误是因为泛型不支持子类型。 Number a = new Integer(5) 是有效大小写。但是一旦你放了泛型,它就会给出编译错误ArrayList&lt;Number&gt; a = new ArrayList&lt;Integer&gt;() is not allowed。看看这个链接是否有助于https://dzone.com/articles/5-things-you-should-know-about-java-generics 理解一些关于泛型的指南。

    【讨论】:

    • 很好的链接,我不知道泛型是如何工作的,什么是多重边界,以及为什么你不能子类型。但是您可以使用链接中提到的带有 extends 和 super 的通配符,这可能在这里起作用。
    【解决方案2】:

    让我们看看如果你写的东西是可能的会发生什么:

    HashMap<String, String[]> foo = new HashMap<String, String[]>();
    Map<String, Object> bar = foo;
    bar.put("key",new Object());
    String[] baz = foo.get("key"); // <-- ClassCastException
    

    看到问题了吗?一系列正常的、平凡的操作将导致 ClassCastException 在您认为不可能发出一个的地方。

    编辑:总而言之,Map&lt;String, Object&gt; 不是Map&lt;String, String&gt;、Map&lt;String, Object[]&gt; 或Map&lt;String, String[]&gt; 的超类型,因此分配将不起作用,因为类型不兼容。这就是通配符的用武之地;见this answer和this one too

    【讨论】:

    • 你是绝对正确的,但由于我可以通过转换为未参数化的Map 来绕过我的错误,我仍然有能力搞乱可怜的正常日常操作;)你不认为它会只获得未经检查的警告而不是不兼容的类型错误更相关?
    【解决方案3】:

    这样做:

    Map<String, ? extends Object> mObj = new HashMap<String, String[]>();
    

    但我不能告诉你为什么你的解决方案不起作用。

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 2010-10-26
      • 2018-02-25
      • 2020-08-01
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      相关资源
      最近更新 更多