不,他们不是。考虑一下:
Map<String, List<String>> keyToGroup = new HashMap<String, ArrayList<String>>();
keyToGroup.put("foo", new LinkedList<String>());
第二行很好,因为 aLinkedList<String>
是 a List<String>
- 但就将其添加到 a 而言,它在逻辑上并不好,HashMap<String, ArrayList<String>>
因为 aLinkedList<String>
不是a 。ArrayList<String>
为了更清楚:
Map<String, ArrayList<String>> map1 = new HashMap<String, ArrayList<String>>();
Map<String, List<String>> map2 = map1; // This is invalid
map2.put("foo", new LinkedList<String>());
ArrayList<String> oops = map1.get("foo"); // Because this would be broken
这不仅仅是将集合作为类型参数的情况。使用普通继承更简单:
List<Banana> bunchOfBananas = new ArrayList<Banana>();
List<Fruit> fruitBowl = bunchOfBananas; // Invalid!
fruitBowl.add(new Apple());
Banana banana = bunchOfBananas.get(0);
即使每个香蕉都是水果,所以“香蕉集合”是“水果集合*”,在获取它们的意义上,并不是每个水果都是香蕉。
在某些情况下,您可以使用通配符参数化类型来提供帮助,但这完全取决于您要实现的目标。