Map.get(Object key)不是(完全)通用的原因是什么

2022-08-31 04:33:02

决定在java.util.Map,V>的接口中没有完全泛型的get方法的原因是什么<

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

V get(Object key)

而不是

V get(K key)

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


答案 1

正如其他人所提到的,等的原因不是通用的,因为您正在检索的条目的键不必与您传入的对象具有相同的类型;该方法的规范仅要求它们相等。这取决于该方法如何将 Object 作为参数,而不仅仅是与对象相同的类型。get()get()equals()

尽管通常许多类都定义了它的对象只能等于它自己类的对象,但在 Java 中有很多地方并非如此。例如,的规范说,如果两个 List 对象都是 List 并且具有相同的内容,即使它们是 的不同实现,则两个 List 对象是相等的。因此,回到这个问题中的示例,根据该方法的规范,可以有一个和我用as参数调用,并且它应该检索密钥,该密钥是具有相同内容的列表。如果是通用的并限制了其参数类型,则不可能做到这一点。equals()List.equals()ListMap<ArrayList, Something>get()LinkedListget()


答案 2

Google的一位出色的Java程序员Kevin Bourrillion不久前在一篇博客文章中写了这个问题(诚然,在上下文中而不是)。最相关的句子:SetMap

一般来说,Java Collections Framework(以及Google Collections Library)的方法从不限制其参数的类型,除非有必要防止集合被破坏。

我不完全确定我是否同意它作为一个原则 - 例如,.NET似乎很好,需要正确的键类型 - 但它值得遵循博客文章中的推理(提到.NET后,值得解释的是,它在.NET中不是问题的部分原因是.NET中存在更大的问题,方差更有限...)