为什么Map不扩展Collection接口

时间:2011-04-18 08:11:03

标签: java collections map

为什么java.util.Map接口没有扩展java.util.Collection接口?不是java.util.Map一组键值对吗?

5 个答案:

答案 0 :(得分:27)

Collection假设一个值的元素。 Map假定键/值对的条目。它们可以被设计为重用相同的公共接口,但是它们实现的某些方法是不兼容的,例如。

Collection.remove(Object) - removes an element.
Map.remove(Object) - removes by key, not by entry.

您可以将Map建模为条目集合,这是Map.entrySet()所做的。

有一些共同的方法; size()isEmpty()clear()putAll/addAll()但这些作为独立界面不太可能具有多大价值。 (同样可以使用Map.entrySet()

答案 1 :(得分:19)

因为Collection接口与Map接口很大程度上不兼容。如果Map延长Collection,那么add(Object)方法会做什么?

这两个接口具有非常不同的语义。如果您需要Map作为集合的值或键,则可以始终使用keySet() / values()

答案 2 :(得分:4)

因为Collections中声明的某些方法不适合Map接口,反之亦然。

第一个示例是add(Object)接口的Collections方法,第二个示例是put(K, V)接口的Map

没有一致的方法可以合理地实现地图的add(Object) - 这是一个关键,它是一个价值吗?这同样适用于put(K, V)。什么可能是ArrayList中的关键?

答案 3 :(得分:3)

  

为什么没有java.util.Map接口   扩展java.util.Collection接口?

Map是键/值对,而Collection是以结构化方式存储的一组对象的集合,并具有指定的访问机制。 Map没有扩展Collections接口的原因是add(E e);不能像Map put(K, V)那样提供键值对。

此外,如果iterator()必须扩展它,Collection的Map方法会指向什么?键的迭代器或值的迭代器?

答案 4 :(得分:1)

所有集合必须实现默认构造函数和另一个将集合作为参数的构造函数。您无法使用除地图之外的任何其他集合构建地图。

由于Map对它可以容纳的对象类型施加限制,因此无法将地图实现为集合。