【问题标题】:Map<String, Map<String, Boolean>> myMap = new HashMap<String,HashMap<String,Boolean>>();Map<String, Map<String, Boolean>> myMap = new HashMap<String,HashMap<String,Boolean>>();
【发布时间】:2011-04-07 21:37:41
【问题描述】:

为什么这在 java 中不起作用,但它起作用了

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

只是为了澄清下面对嵌套 HashMap 的更改显示了编译器错误,而上面没有;带有地图(不是哈希图)

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

【问题讨论】:

    标签: java map nested hashmap


    【解决方案1】:

    这是因为 Java 中的泛型是不变的,即即使 B 类是 A,Collection&lt;B&gt;不是Collection&lt;A&gt;

    这是有充分理由的。如果你的例子是合法的,这是可能的:

    Map<String, HashMap<String, Boolean>> myHashMap = new HashMap<String,HashMap<String,Boolean>>();
    Map<String, Map<String, Boolean>> myMap = myHashMap;
    myMap.put("oops", new TreeMap<String, Boolean>());
    HashMap<String, Boolean> aHashMap = myMap.get("oops"); // oops - ClassCastException!
    

    【讨论】:

    • 但是,鉴于 myMap 的声明,只要它们实现 Map 接口,我会在乎放什么样的地图?
    • @extraneon:在这种情况下,请参阅鲍里斯的回答。
    • Java 泛型可以有使用方面的差异,但不能有声明方面的差异。 (后者对于将接口惯用为“告诉不问”或不可变的语言是有意义的。)
    • 我理解为什么从技术角度来看,它使泛型的实现更容易。但从功能的角度来看,这并不是那么合乎逻辑。如果我说(我不能这样做)我的地图包含地图值,那么我也承诺不会从那里获取特定类型的地图。但我不能说这张地图包含地图,但它必须包含特定类型的地图。对我来说,这是使泛型实现可行的妥协,而不是功能:)
    • @extraneon,这个带有地图的具体示例有点扭曲;请参阅this earlier answer of mine 以获得更简单且(希望)更具启发性的示例。
    【解决方案2】:

    在第二种情况下,myMap 是一个映射,其中键的类型为 String,值的类型为 Map&lt;String, Boolean&gt;HashMap&lt;String, Boolean&gt; 不是 Map&lt;String, Boolean&gt; 它实现了它。因此,这将编译:

    Map<String, ? extends Map<String, Boolean>> myOtherMap = 
        new HashMap<String,HashMap<String,Boolean>>();
    

    【讨论】:

    • A HashMap 是一个 Map
    • Ricky 说得对,“is a”的使用是不幸的(因为 HashMap isa Map)。本质上使用? extends 放宽了Generic 的类型要求,从完全匹配到继承层次匹配。
    【解决方案3】:

    我认为这是因为Map&lt;String, Boolean&gt;HashMap&lt;String,Boolean&gt; 之间的差异。 实际上,泛型在这里是一种规范,双方必须相同。 (或者至少这是我的看法)。

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 2012-05-26
      • 2018-06-19
      • 1970-01-01
      • 2018-02-25
      • 2021-11-13
      • 2012-06-30
      • 1970-01-01
      • 2022-07-19
      相关资源
      最近更新 更多