使用无界通配符类型向集合添加数据

时间:2014-01-10 08:32:40

标签: java generics wildcard

两者有什么区别?为什么我不能将数据添加到第一个,但可以添加到第二个?

   HashMap<?, Object> map = new HashMap<>();
   map.put(Integer.class, 1); // Error

   HashMap<Class<?>, Object> map2 = new HashMap<>();
   map2.put(Integer.class, 1); // Ok

2 个答案:

答案 0 :(得分:1)

在第一种情况下,键的类型是任何具体的(即地图的所有键都相同),因此我们不能插入除null之外的任何内容,因为我们不知道知道这种类型。 (因此map可以包含HashMap<Integer, Object>HashMap<String, Object>或其他类型的值。

在第二种情况下,键的类型为Classany concrete类型 - 参数,可能因一个键不同而非。因此,您将cat放入此映射中的键值对,其中键是ClassClass<Integer>Class<String>,...)的任何实例,但您不能将键放在其他类型(例如,IntegerString,...)

答案 1 :(得分:0)

通过本教程,这可能有助于您了解外卡及其用途。

http://ted-gao.blogspot.co.uk/search/label/Java%20Generics

以及List和map ::

之间的区别
Java map: An object that maps keys to values. A map cannot contain duplicate keys; each key can  map to at most one value.

Java list: An ordered collection (also known as a sequence).The user of this interface has precise control over where in the list each element is inserted. The user can access elements by their integer index (position in the list), and search for elements in the list.