我试图定义然后实现一个抽象的setter,它以对象列表作为参数。以下是这个简单想法的要点:
public abstract class MyClass {
public abstract void setThings(List<?> things);
}
public class Bar extends MyClass {
private List<String> things;
@Override
public void setThings(List<String> things) {
this.things = things;
}
}
这不起作用。我得到Method does not override method from its superclass
和both methods have the same erasure, but neither overrides the other
。我理解后者与擦除有关的错误,但即便如此,我也无法找到正确的方法来做到这一点。我尝试过其他一些像:
public abstract <T> void setThings(List<T> things);
......以及其他一些人。而且我已经找到了其他问题/答案,这些问题/答案接近于解决这个问题,但没有一个提供了可靠的答案(至少对我来说并不清楚)。我通过the tutorials阅读也无济于事。我错过了什么?
答案 0 :(得分:4)
所以Java非常正确地告诉你,你还没有实现抽象方法setThings
,它采用List<?>
而不是List<T>
或List<String>
。所有这些都是不同的东西。请参阅this question for a detailed explanation。
最简单的解决方案是为您的抽象类引入泛型:
public abstract class MyClass<T> {
public abstract void setThings(List<T> things);
}
public class SubClass extends MyClass<String> {
private List<String> things;
public void setThings(List<String> things) {
this.things = things;
}
}
答案 1 :(得分:2)
List<?> things
是未知类型的列表。
List<T> things
是T
类型的列表。
这两件事情不一样,这就是你得到编译错误的原因。
有几种明智的方法可以消除错误:
对两个类进行一致化
abstract class MyClass<T> {
public abstract void setThings(List<T> things);
}
class Bar<T> extends MyClass<T> {
private List<T> things;
@Override
public void setThings(List<T> things) {
this.things = things;
}
}
让Bar
接受未知类型的列表
abstract class MyClass {
public abstract void setThings(List<?> things);
}
class Bar extends MyClass {
private List<?> things;
@Override
public void setThings(List<?> things) {
this.things = things;
}
}