【发布时间】:2011-02-08 18:11:25
【问题描述】:
Map<?,?> 不是Collection<?>,这让我很惊讶。
我认为如果这样声明它会很有意义:
public interface Map<K,V> extends Collection<Map.Entry<K,V>>
毕竟Map<K,V> 是Map.Entry<K,V> 的集合,不是吗?
那么是否有充分的理由不这样做?
感谢 Cletus 提供最权威的答案,但我仍然想知道为什么,如果您已经可以将 Map<K,V> 视为 Set<Map.Entries<K,V>>(通过 entrySet()),它不仅仅扩展了该接口。
如果
Map是Collection,那么元素是什么?唯一合理的答案是“键值对”
没错,interface Map<K,V> extends Set<Map.Entry<K,V>> 会很棒!
但这提供了一个非常有限的(并且不是特别有用)
Map抽象。
但如果是这样,那么为什么接口指定了entrySet?它一定是有用的(而且我认为很容易为这个立场争论!)。
您不能询问给定键映射到什么值,也不能在不知道它映射到什么值的情况下删除给定键的条目。
我并不是说这就是Map 的全部内容!它可以并且应该保留所有其他方法(entrySet 除外,它现在是多余的)!
【问题讨论】:
-
事件集
> 实际上 -
它只是没有。它基于一种意见(如设计常见问题解答中所述),而不是一个合乎逻辑的结论。如需另一种方法,请查看 C++ STL (sgi.com/tech/stl/table_of_contents.html) 中的容器设计,该设计基于 Stepanov 彻底而出色的分析。
-
OP 改变了他们的问题,我不确定 SO 规则是否允许。对于不耐烦的人,在@einpoklum 的回答中对后一个问题(为什么它不能从
Set<Map.Entry<K,V>>继承)有一个简洁的回答。但是对于最初的问题(如标题),我还没有在这里找到任何好的答案,除了常见问题解答中引用的by design。
标签: java oop collections