猿问

Map.get(对象键)不(完全)泛型的原因是什么?

Map.get(对象键)不(完全)泛型的原因是什么?

的接口中没有一个完全通用的get方法的原因是什么?java.util.Map<K, V>.

为了澄清这个问题,方法的签名是

V get(Object key)

而不是

V get(K key)

我想知道为什么(同样的事情)remove, containsKey, containsValue).


慕田峪9158850
浏览 1056回答 3
3回答

智慧大石

正如其他人提到的,为什么get()等不是泛型的,因为要检索的条目的键不必与传入的对象类型相同。get()该方法的规范只要求它们相等。这源于equals()方法接受对象作为参数,而不仅仅是与对象相同的类型。虽然通常情况下,很多类都有equals()定义它的对象只能等于它自己类的对象,在Java中有很多地方都不是这样的。例如,List.equals()表示如果两个列表对象都是列表,并且具有相同的内容,则它们是相等的,即使它们是List..所以回到这个问题中的例子,根据这个方法的规范,有可能有一个Map<ArrayList, Something>让我给你打电话get()带着LinkedList作为参数,它应该检索具有相同内容的列表的键。如果get()都是通用的并且限制了它的参数类型。

慕容3067478

最相关的一句话:一致地,Java集合框架(以及Google集合库也是如此)的方法从不限制它们参数的类型,除非有必要防止集合被破坏。作为一个原则,我不完全同意它-例如,.NET似乎可以要求正确的键类型-但值得遵循博客文章中的推理。(提到.NET后,值得解释的是,在.NET中没有问题的部分原因是更大在.NET中差异比较有限的问题.)

温温酱

合同如下:更正式地说,如果这个映射包含从键k到值v的映射,那么(key=null?)K=NULL:键等于(K)),则此方法返回v;否则返回NULL。(最多只能有一个这样的映射。)(我强调)因此,成功的密钥查找取决于输入键的相等方法的实现。那不是必然依赖于k类。
随时随地看视频慕课网APP

相关分类

Java
我要回答