如何在java中正确实例化映射集?

如何在java中正确实例化映射集?,java,hashmap,set,Java,Hashmap,Set,我想要一个集合实例。但是,我不能用新HashSet实例化它 我要么把它改成 Set<HashMap<Character, Integer>> v = new HashSet<HashMap<Character, Integer>>(); Set v=new HashSet(); 或 Set v=new HashSet();//我更喜欢这个 有谁能告诉我为什么Java不能将HashSet转换为Set?向您展示一个等价的情况更简单-让我们使用对象

我想要一个
集合
实例。但是,我不能用
新HashSet
实例化它

我要么把它改成

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

Set v=new HashSet();//我更喜欢这个

有谁能告诉我为什么Java不能将
HashSet
转换为
Set

向您展示一个等价的情况更简单-让我们使用
对象
字符串
代替
映射
HashMap

假设我们可以编写
Set=newhashset()。那么该代码必须是有效的:

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

String firstString = strings.iterator().next(); // Bang!
HashSet strings=newhashset();
HashSet对象=字符串;
对象。添加(新对象());//不是一根绳子!
String firstString=strings.iterator().next();//猛敲
你看到这里出了什么问题吗?一组字符串不是一组对象,因为您可以将任何对象添加到一组对象中,而一组字符串只能包含字符串


一旦你了解了这一点,把它移回到更复杂的情况:一个
集合
只能包含
哈希映射
元素。。。而使用
集合
可以添加任何类型的
映射
。所以它们是不兼容的。

泛型不是协变的

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

class Fruit{}
class Apple extends Fruit{}
class Bababa extends Fruit{}
如果你为水果创建了一套

Set<Fruit> myFruits

我明白了,这种泛型必须是表面的。感谢您的回答。下面的答案是正确的,但与您的情况并不相关-为什么您要在泛型签名中使用
Map
的实际实现类?由于Java 7,您可以用一种更短的方式编写赋值,从而避免这个问题:
Set v=new HashSet()
Set<Fruit> myFruits
Set<Map<Character, Integer>> v3 = new HashSet<Map<Character, Integer>>();
//  ^^^                                       ^^^