如何在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>>();
// ^^^ ^^^