Java泛型名称冲突,具有相同的擦除

2022-09-01 08:56:09

我有超班傅。以及扩展它的类栏。

public class Bar extends Foo

Foo 中的功能:

protected void saveAll(Collection<?> many)

酒吧中的功能:

public void saveAll(Collection<MyClass> stuff) {
   super.saveAll(stuff);
}

获取错误 :

 Name clash: The method saveAll(Collection<MyClass>) of type Bar has the same erasure as saveAll(Collection<?>) of type Foo but does not override it.

我做错了什么?


答案 1

您正在使用不兼容的类型重写该方法。也许你想做这样的事情:saveAll

public class Bar extends Foo<MyClass>

功能在Foo<E>

protected void saveAll(Collection<E> many)

和工具栏中的函数:

public void saveAll(Collection<MyClass> stuff) {
   super.saveAll(stuff);
}

答案 2

由于Java的类型擦除功能,JVM将无法知道它是具有参数化类型MyClass的方法还是应该调用的第一个方法。

如果可能或适用,我见过的避免这种情况的最常用模式是将类更改为具有参数化类型:Foo

public class Foo<T> {
    protected void saveAll(Collection<T> many) {}
}

然后让 Bar 针对您的特定类型简单实现:Foo

public class Bar extends Foo<MyClass> {
    public void saveAll(Collection<MyClass> many) {
        super.saveAll(many);
    }
}

推荐