为什么Map不扩展Collection接口
为什么java.util.Map
接口没有扩展java.util.Collection
接口? java.util.Map
不是Key-Value对的集合吗?
集合假设一个值的元素。 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()
代替)
因为Collection
接口与Map
接口很大程度上不兼容。 如果Map
扩展Collection
, add(Object)
方法会做什么?
这两个接口具有非常不同的语义。 如果需要Map
的值或键作为集合,则始终可以使用keySet()
/ values()
。
因为在Collections
声明的某些方法不适合Map
接口,反之亦然。
第一个示例是Collections
接口的add(Object)
方法,
第二个例子是Map
接口的put(K, V)
。
没有一致的方法可以合理地为Map实现add(Object)
– 它是一个键,它是一个值吗? 对于put(K, V)
同样有效。 什么可能是ArrayList
的键?
为什么java.util.Map接口没有扩展java.util.Collection接口?
Map
是键/值对,而Collection
是以结构化方式存储的一组对象的集合,具有指定的访问机制。 Map不扩展Collections接口的原因是add(E e);
不像Map的put(K, V)
那样提供键值对。
另外,如果Map
必须扩展它,那么Collection的iterator()
方法会指向什么? 键的迭代器或值的迭代器?
所有集合都必须实现默认构造函数和另一个将集合作为参数的构造函数。 您无法使用除地图之外的任何其他集合构建地图。
由于Map对其可以容纳的对象类型施加限制,因此无法将地图实现为集合。