【问题标题】:Java Collection LinkedList Function Argument Types [duplicate]Java集合LinkedList函数参数类型[重复]
【发布时间】:2012-07-22 09:20:48
【问题描述】:

可能重复:
Why aren't Java Collections remove methods generic?

我注意到很少有 LinkedList 操作采用 Generic 参数类型 E,而少数采用 'Object' 作为参数。例如,

add(E e) 
remove(Object o) 

这样做有什么具体原因吗?为什么不让 'remove' 采用泛型类型 E。(我知道类型擦除后没关系,但只是想知道)。

【问题讨论】:

    标签: java generics collections


    【解决方案1】:

    因为调用者可以使用任何类型的对象调用remove 或contains,并且代码仍然可以正常执行。集合的类型参数使用的编译时协定只是保证* in 集合中的任何东西都是给定的类型。它不关心你是否询问它是否包含不同类型的对象。

    *Nitpicker's Corner,我知道 Java 泛型确实不能保证。我想更多的语法糖。

    【讨论】:

      【解决方案2】:

      add 和 remove 方法都继承自 Collection 接口。 remove 方法没有用通用参数进行改造,大概是因为它无关紧要。删除不会影响集合的类型安全,当您更改地球上最流行的 API 之一时,更改越少越好。你会看到 contains 方法也遭受了同样的命运。

      【讨论】:

      • “因为没关系”它确实很重要。不同类型的对象可以相等。
      • 这不会因为不同类型的对象永远不能添加到参数化集合中,因此要求将 remove 方法参数化没有任何好处。
      • 我没有说任何关于添加到收藏中的东西。只是remove()方法的定义要求它删除等于传递的东西的东西
      【解决方案3】:

      这是因为 removal 操作使用equals() 方法检查相等性,而equals() 方法将对象作为非通用参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多