不,他们不是。考虑一下:
Map<String, List<String>> keyToGroup = new HashMap<String, ArrayList<String>>();
keyToGroup.put("foo", new LinkedList<String>());
第二行很好,因为LinkedList<String>
is a List<String>
- 但将其添加到 a 中在逻辑上并不好HashMap<String, ArrayList<String>>
,因为一个LinkedList<String>
is not an 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);
尽管每根香蕉都是一种水果,所以“香蕉的集合”是“水果的集合*”fetching对他们来说,并不是所有的水果都是香蕉。
您可以使用通配符参数化类型 http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#Topic4在某些情况下会有所帮助,但这取决于您想要实现的目标。