English 中文(简体)
为什么 Java地图扩展收集?
原标题:Why doesn t Java Map extend Collection?

我感到惊讶的是,<代码>Map<?>不是Collection<?>

我认为,如果被宣布为“LOT”具有意义:

public interface Map<K,V> extends Collection<Map.Entry<K,V>>

http://java.sun.com/javase/6/docs/api/java/util/Map.Entry.html

因此,它为什么没有得到执行?


感谢 但是,我仍然想知道,如果你能够看到<代码>Map<K,V>作为<代码>Set<Map.Entries<K,V>>(通过enterSet(),那么它只是将这一接口延伸。

如果<代码>Map 是Collection,内容是什么? 唯一合理的答案是“高价值奶制品”。

实际上,<代码> 地图和设计;K,V> 扩展套和带;Map.Entry<K,V>>将大!

但这提供了非常有限的(而不是特别有用的)<代码>Map抽象。

但是,如果是这样的话,那么接口具体说明的“<编码>输入Set? 它必须有所助益(我认为它很容易为这一立场辩解!)

你可以不了解某一关键地图的价值,也不能够删除某一关键人物的条目。

我不想说,在座的所有人都是<代码>。 页: 1 它可以和should 保留所有其他方法(除<条码>条目Set外,现在多余)!

最佳回答

http://docs.oracle.com/javase/8/docs/technotes/guides/collections/ Designfaq.html#a14” rel=“noreferer”

Why doesn t Map extend Collection?

This was by design. We feel that mappings are not collections and collections are not mappings. Thus, it makes little sense for Map to extend the Collection interface (or vice versa).

If a Map is a Collection, what are the elements? The only reasonable answer is "Key-value pairs", but this provides a very limited (and not particularly useful) Map abstraction. You can t ask what value a given key maps to, nor can you delete the entry for a given key without knowing what value it maps to.

Collection could be made to extend Map, but this raises the question: what are the keys? There s no really satisfactory answer, and forcing one leads to an unnatural interface.

Maps can be viewed as Collections (of keys, values, or pairs), and this fact is reflected in the three "Collection view operations" on Maps (keySet, entrySet, and values). While it is, in principle, possible to view a List as a Map mapping indices to elements, this has the nasty property that deleting an element from the List changes the Key associated with every element before the deleted element. That s why we don t have a map view operation on Lists.

<>Update: 我认为,大多数问题都得到了答案。 值得强调的是,收集条目并非特别有用的摘要。 例如:

Set<Map.Entry<String,String>>

允许:

set.add(entry("hello", "world"));
set.add(entry("hello", "world 2"));

(假设一种<代码> 输入()方法,该方法可生成Map.Entry.

<代码>Map要求有独特的钥匙,从而违反此规定。 或者如果你在<代码>上规定独特的钥匙 条目从一般意义上说不是<代码>Set。 它有进一步限制的<条码>Set。

可以说,<代码>等值(/hashCode(> relationship for Map.Entry纯属关键,但甚至有问题。 更重要的是,这是否真正增加了任何价值? 你们一旦开始研究独角兽案件,就可能会发现这种抽象现象。

值得注意的是,<代码>HashSet实际上是作为而不是以其他方式实施的。 这纯粹是一个执行细节,但令人感兴趣。

之所以存在<代码>enterSet()的主要原因是要简化手续,这样你就不必绕过钥匙,然后对钥匙进行调查。 Don t视之为初步证据:Map应为的条目(imho)。

问题回答

虽然你略微回答了你的问题,但我认为,或许应该退步,更全面地审视这个问题。 也就是说,不要具体研究瓦 Java图书馆是如何制作的,并研究为什么会这样写。

这里的问题是,继承只是模式one。 如果你发现两件似乎“类似收集”的物品,你可能会发现八件或十件共同的东西。 如果你拿走不同的“类似收集”物品,那么,它们也会照常打出8或10件东西——但是它们打上了第一个奶粉。

如果你看看着十几个或数种不同的“照收”物品,其中几乎每一个件都可能具有8或10种特征,至少彼此相同——但如果你看一看在every之间共有的东西,你就没有留下任何东西。

这种状况是继承(特别是单一继承)的典范。 两者中哪些是实际收集的,哪些是头收集的,但如果你想要界定有意义的收集类别,你会再把其中一些人排除在外。 如果你只离开其中几个人,那么你的收款班只能提供相当松散的接口。 如果你离开,你就能够给它一个更丰富的接口。

有些人还选择基本上说:“这种收集方式支持X的运作,但你不允许使用X,从界定X的基类中提取,而是试图使用X类衍生物(例如,放弃例外)。

这仍然留下了一个问题:几乎不管你离开哪里,以及你说什么,你将不得不在课堂和课堂之间打下一条硬线。 不管你走这条路,你会重新在“quite类似的一些东西之间留下一个明确而人为的分裂。

我想why是主观的。

在C#中,我想Dictionary推广或至少实施收集:

public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
    ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, 
    IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback

In Pharo Smalltak as well:

Collection subclass: #Set
Set subclass: #Dictionary

但有些方法不对称。 例如,<代码>收:将采用联系方式(相当于条目),<代码>do:采用数值。 它们提供了另一种方法<代码>keysAndValuesDo:,以便在入境时将字典照发。 。 采用一种协会,但remove: has been“suppressed”:

remove: anObject
self shouldNotImplement 

因此,它确实是可行的,但导致某些关于等级等级的其他问题。

更好的是主观的。

神职的回答是好的,但我要补充一种调和的办法。 把两者结合起来是毫无意义的,因为我们认为你通过收集接口添加了关键价值,而且关键已经存在。 地图接口只允许与钥匙相关的一个价值。 但是,如果你用同样的钥匙自动取消现有条目,则收集工作在增加以前的规模之后——非常意外地进行收集。

Java收集工作被打破。 有一个缺失的接口,即亲属。 因此, 地图的扩展范围 地图(“功能”)有独一无二的名称(或钥匙),这些名称当然是价值地图。 序列号扩展地图(每个关键部分都是ger化和gt;0)。 包裹(或多组)扩展地图(如果每个关键点是一元件,每个数值是该元件出现在袋里的次数)。

这种结构将允许一系列“收集”的交叉、结合等。 因此,等级应是:

                                Set

                                 |

                              Relation

                                 |

                                Map

                                / 

                             Bag Sequence

Sun/Oracle/Java ppl - 下次获得。 感谢。

<代码>Map<K,V>不应延伸。 Set<Map.Entry<K,V>> since:

  • You can t add different Map.Entrys with the same key to the same Map, but
  • You can add different Map.Entrys with the same key to the same Set<Map.Entry>.

如果你看一下各自的数据结构,你可以很容易地猜测为什么<代码>。 页: 1 每张<代码>Collection就有一个单一价值,作为储存关键值的乳制品。 因此,<代码>Collection接口中的方法与<代码>Map接口不一致。 例如,在<条码>中,我们有<条码>+(Object o)。 将在<代码>Map上实施。 在<代码>Map上采用这种方法并无意义。 相反,我们在<代码>Map上采用了<代码>(关键,价值)方法。

Same argument goes for addAll(), remove(), and removeAll() methods. So the main reason is the difference in the way data is stored in Map and Collection. Also if you recall Collection interface implemented Iterable interface i.e. any interface with .iterator() method should return an iterator which must allow us to iterate over the values stored in the Collection. Now what would such method return for a Map? Key iterator or a Value iterator? This does not make sense either.

我们可以在<条码>Map上调取钥匙和价值储存,这就是它如何成为<条码>的一部分。

Exactly, interface Map<K,V> extends Set<Map.Entry<K,V>> would be great!

实际执行 Map<K,V>, Set<Map.Entry<K,V>>,然后我同意。 这似乎甚至是自然的。 但是,这并没有很好地发挥作用? 请允许我说,我们有<条码>。 HashMap 执行 Map<K,V>, Set<Map.Entry<K,V>LinkedHashMap Implements Map<K,V>, Set<Map.Entry<K,V> 等都很好,但如果您有enterSet(,任何人都不会忘记采用这种方法,而且你可以肯定,你可以进入。 为任何地图打造,而如果你希望执行者已经安装了两个接口,则你是头号。

我不想有<条码>内在地图和带;K,V>Ex Set<Map.Entry<K,V>>只是因为将有更多的方法。 毕竟,它们是不同的东西,正确吗? 同样实际上,如果我打上了map. in IDE,我不想见.remove(Object obj), 和remove(Map.Entry<K,V> 条目),因为我可以做的是hit ctrl+space, r, 回去,并随附。

  1. The Map interface in Java follows key/value pair structure whereas the Collection interface is collection of objects which are stored in structure with a specified mechanism.
  2. The main reason map doesn t extend Collection interface is that add(E e) method of collection interface doesn t support key-value pair like map interface s put(k,v) method.
  3. It might not extend Collection interface but still an integral part of Java Collection framework

Straight and simple. Collection is an interface which is expecting only one Object, whereas Map requires Two.

Collection(Object o);
Map<Object,Object>




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签