【发布时间】:2012-07-22 09:20:48
【问题描述】:
我注意到很少有 LinkedList 操作采用 Generic 参数类型 E,而少数采用 'Object' 作为参数。例如,
add(E e)
remove(Object o)
这样做有什么具体原因吗?为什么不让 'remove' 采用泛型类型 E。(我知道类型擦除后没关系,但只是想知道)。
【问题讨论】:
标签: java generics collections
我注意到很少有 LinkedList 操作采用 Generic 参数类型 E,而少数采用 'Object' 作为参数。例如,
add(E e)
remove(Object o)
这样做有什么具体原因吗?为什么不让 'remove' 采用泛型类型 E。(我知道类型擦除后没关系,但只是想知道)。
【问题讨论】:
标签: java generics collections
因为调用者可以使用任何类型的对象调用remove 或contains,并且代码仍然可以正常执行。集合的类型参数使用的编译时协定只是保证* in 集合中的任何东西都是给定的类型。它不关心你是否询问它是否包含不同类型的对象。
*Nitpicker's Corner,我知道 Java 泛型确实不能保证。我想更多的语法糖。
【讨论】:
add 和 remove 方法都继承自 Collection 接口。 remove 方法没有用通用参数进行改造,大概是因为它无关紧要。删除不会影响集合的类型安全,当您更改地球上最流行的 API 之一时,更改越少越好。你会看到 contains 方法也遭受了同样的命运。
【讨论】:
remove()方法的定义要求它删除等于传递的东西的东西
这是因为 removal 操作使用equals() 方法检查相等性,而equals() 方法将对象作为非通用参数。
【讨论】: