为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Java集合删除方法不是泛型的?

为什么Java集合删除方法不是泛型的?

弑天下 2019-06-28 10:48:57
为什么Java集合删除方法不是泛型的?为什么集合.删除(对象o)通用的?好像Collection<E>本可以boolean remove(E o);然后,当您意外尝试删除(例如)Set<String>而不是从Collection<String>,这将是编译时错误,而不是稍后的调试问题。
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

remove()(在Map以及Collection)不是泛型的,因为您应该能够将任何类型的对象传递给remove()..移除的对象不必与传入的对象类型相同。remove()它只要求它们是平等的。从.的规范remove()remove(o)移除对象e使.(o==null ? e==null : o.equals(e))true..请注意,没有什么需要oe同样的类型。这源于以下事实:equals()方法接受一个Object作为参数,而不仅仅是与对象相同的类型。

虽然,通常情况下,许多类都有equals()定义它的对象只能等于它自己类的对象,当然不是总是这样。例如,List.equals()表示如果两个列表对象都是列表,并且具有相同的内容,则它们是相等的,即使它们是List..所以回到这个问题中的例子,有可能有一个Map<ArrayList, Something>让我给你打电话remove()带着LinkedList作为参数,它应该删除包含相同内容的列表的键。如果remove()都是通用的并且限制了它的参数类型。


查看完整回答
反对 回复 2019-06-28
?
心有法竹

TA贡献1866条经验 获得超5个赞

因为如果类型参数是通配符,则不能使用泛型删除方法。

我似乎还记得用Map的get(Object)方法遇到了这个问题。在这种情况下,GET方法不是泛型的,尽管它应该被合理地期望被传递一个与第一个类型参数相同类型的对象。我意识到,如果您将通配符作为第一个类型参数传递给Maps,那么如果该参数是泛型的,则无法使用该方法从Map中获取元素。通配符参数不能真正满足,因为编译器不能保证类型是正确的。我推测Add之所以是泛型的,是因为在将其添加到集合之前,您应该确保类型是正确的。然而,当移除一个对象时,如果类型不正确,那么它无论如何也不会匹配任何东西。如果该参数是通配符,则该方法将是不可用的,即使您可能有一个您可以保证属于该集合的对象,因为您刚刚在上一行中得到了对它的引用.

我可能解释得不太清楚,但这在我看来是合乎逻辑的。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 632 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信