![](/img/trans.png)
[英]How implement method with List that contains generic parameter with parameter
[英]Implement generic method with List parameter
我正在尝试定义然后实现一个将对象列表作为参数的抽象设置器。 这是这个简单想法的要点:
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);
...以及其他一些 而且我发现了关于SO的其他问题/答案,可以解决这个问题,但没有一个提供可靠的答案(至少对我来说不是很清楚)。 我也通读了这些教程 ,但都无济于事。 我想念什么?
因此,Java完全正确地告诉您尚未实现抽象方法setThings
,该方法采用List<?>
而不是List<T>
或List<String>
。 所有这些都是不同的东西。 有关详细说明,请参见此问题 。
最简单的解决方案是为您的抽象类也引入泛型:
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;
}
}
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; } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.