我试图理解使用以下代码得到的名称冲突错误:
import java.util.*;
import javax.swing.*;
class Foo<R extends Number> {
public void doSomething(Number n, Map<String, JComponent> comps) {
}
}
class Bar extends Foo {
public void doSomething(Number n, Map<String, JComponent> comps) {
}
}
错误信息:
错误:名称冲突:
doSomething(Number,Map<String,JComponent>)
inBar
和doSomething(Number,Map<String,JComponent>)
inFoo
具有相同的擦除,但都不会覆盖另一个
我知道我可以通过从 中删除泛型类型Foo
或将Bar
声明更改为class Bar extends Foo<Integer>
;来修复它。我想知道的是为什么在特定情况下会发生此错误,但是如果我comps
从每个方法中删除参数就会消失。我已经阅读了有关类型擦除的一些内容,但在我看来,无论是否使用泛型,这两种方法都应该具有相同的擦除,因此在任何一种情况下都是有效的覆盖。(请注意,我什至还没有在任何地方使用过泛型参数,这就是我如此惊讶的原因。)
我知道我之前已经向父类添加了泛型类型,但只收到关于子类的警告,而不是错误。谁能解释这种情况?