为什么Map接口没有继承Collection接口?

19
为什么 java.util.Map 接口不继承 java.util.Collection 接口呢?难道 java.util.Map 不是一个 Key-Value 对的集合吗?

3
不是它。如果实现了,Map.entrySet() 才是。 - bestsss
5个回答

29

集合(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()代替)

21
因为Collection接口与Map接口在很大程度上不兼容。如果Map扩展了Collection,那么add(Object)方法会做什么呢?
这两个接口具有非常不同的语义。如果您需要作为集合使用Map的值或键,则始终可以使用keySet()/values()

4
因为一些在Collections中声明的方法不适用于Map接口,反之亦然。
第一个例子是Collections接口中的add(Object)方法,第二个例子是Map接口中的put(K, V)方法。
对于Map来说,没有一种一致的合理方式来实现add(Object)方法——它是一个键还是一个值?同样的情况也适用于put(K, V)方法。在ArrayList中可能有什么是一个键呢?

3
为什么java.util.Map接口不扩展java.util.Collection接口?
Map是一个键值对,而Collection是一组以结构化方式存储的对象集合,并具有指定的访问机制。Map没有扩展Collections接口的原因是add(E e)不能满足像Map的put(K, V)这样的键值对。
此外,如果Map必须扩展Collection接口,那么Collection的iterator()方法将指向什么?键的迭代器还是值的迭代器?

1

所有集合都必须实现一个默认构造函数和另一个以集合为参数的构造函数。你不能使用除了map之外的任何其他集合来构造一个map。

由于Map对它可以持有的对象类型施加了限制,因此你不能将Map实现为一个集合。


1
这两个构造函数并不是严格要求:它们仅适用于通用集合(即不适用于专用集合),并且写作“应该提供两个“标准”构造函数”,因此即使对于通用集合,这也不是绝对必须的。 - Joachim Sauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接