【问题标题】:Why is this conversion not valid? [duplicate]为什么这种转换无效? [复制]
【发布时间】:2016-10-20 08:46:34
【问题描述】:

我想使用带有各种列表作为值的地图:

Map<String, List<Integer>> ml;
Map<String, ?> ml2 = ml; // OK
Map<String, List<?>> ml3 = ml; // Type mismatch

为什么最后一行无效?

【问题讨论】:

  • Map&lt;String, List&lt;?&gt;&gt; 是一个映射,您可以在其中放置一个字符串和任何内容的列表。 Map&lt;String, List&lt;Integer&gt;&gt; 是一个映射,您可以将字符串和整数列表放入其中。

标签: java


【解决方案1】:

它无效,因为如果它有效,您也可以将非整数列表添加到 ml

示例(无效):

Map<String, List<Integer>> ml;
Map<String, List<?>> ml3 = ml; 

ml3.put("strings", Arrays.asList("evil","string"));

List<Integer> l = ml.get("strings"); //see how this is going to fail?

为什么Map&lt;String, ?&gt; ml2 = ml; 有效?那是因为通配符的使用告诉编译器不允许添加新元素,即ml2.put("strings", Arrays.asList("evil","string")); 是不允许的(编译器不做类型检查,它只看到通配符并且知道你不能调用那个方法。

【讨论】:

  • 我认为最好解释一下为什么在这种情况下中间线转换会成功(并表明您不能通过该引用真正将任何内容放入其中,因此它是安全的)。加上它是 ml3.put,但 ml3.add ;)
  • @ArturBiesiadowski 是的,修正了错别字并添加了解释:)
  • 谢谢,我没看到这个问题
  • 请注意,仍然可以将元素添加到 Map&lt;String, ?&gt; - 但唯一可以添加的值是 null(如果地图支持空值)。
【解决方案2】:

Map&lt;String, ?&gt; 会将字符串映射到任何对象,整数列表可以通过此通配符匹配。但是,整数列表不匹配? (List of any object),因为 List of Integer 只能取 Integer 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多