【问题标题】:how to instantiate set of map in java correctly?如何在java中正确实例化一组地图?
【发布时间】:2014-03-01 08:37:07
【问题描述】:

我想要一个Set < Map <Character, Integer> > 实例。但是我不能用new HashSet < HashMap<Character, Integer> > 实例化它。

我必须将其更改为

Set<HashMap<Character, Integer>> v = new HashSet<HashMap<Character, Integer>>();

Set<Map<Character, Integer>> v = new HashSet<Map<Character, Integer>>();   // I prefer this one

谁能告诉我为什么 Java 不能将 HashSet&lt;HashMap&lt;Character, Integer&gt;&gt; 转换为 Set&lt;Map&lt;Character, Integer&gt;&gt;

【问题讨论】:

  • 下面的答案是正确的,但它与您的情况并不真正相关 - 为什么要将您想要使用的Map 的实际实现类放在泛型签名中?从 Java 7 开始,您可以用更短的方式编写作业,也可以回避这个问题:Set&lt;Map&lt;Character, Integer&gt;&gt; v = new HashSet&lt;&gt;();

标签: java hashmap set


【解决方案1】:

向您展示一个等效的情况更简单 - 让我们使用 ObjectString 代替 Map&lt;Character, Integer&gt;HashMap&lt;Character, Integer&gt;

假设我们可以Set&lt;Object&gt; set = new HashSet&lt;String&gt;();。那么这段代码必须是有效的:

HashSet<String> strings = new HashSet<String>();
HashSet<Object> objects = strings;
objects.add(new Object()); // Not a string!

String firstString = strings.iterator().next(); // Bang!

你知道这里出了什么问题吗?一组字符串不是一组对象,因为您可以将 any 对象添加到一组对象中,而一组字符串可以包含字符串。

一旦你明白了这一点,将它移植回你更复杂的情况:Set&lt;HashMap&lt;Character, Integer&gt;&gt; 只能包含HashMap&lt;Character, Integer&gt; 元素...而使用Set&lt;Map&lt;Character, Integer&gt;&gt;,你可以添加 any 有点像Map&lt;Character, Integer&gt;。所以它们不兼容。

【讨论】:

  • 我明白了。谢谢你的回答。
【解决方案2】:

泛型不是协变的。

让我们使用标准示例。你有课

class Fruit{}
class Apple extends Fruit{}
class Bababa extends Fruit{}

如果你为 Fruits 创建集

Set<Fruit> myFruits

您应该传递Set&lt;Fruit&gt; 的实例,而不是Set&lt;Apple&gt;Set&lt;Banana&gt;

这是为什么呢?想一想,通过myFruits 引用,您将能够在集合中存储任何种类的水果,那么如果引用包含Bananas 的集合,让您传递Apple 是否可以?

这就是为什么如果您声明类型为Set&lt;Map&lt;whatever&gt; 的引用,它只能保存旨在保存各种Maps 的实例,而不仅仅是HashMaps

所以

Set<Map<Character, Integer>> v3 = new HashSet<Map<Character, Integer>>();
//  ^^^                                       ^^^

这个泛型类型必须是语义

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 2015-05-12
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多