Java 用List参数实现泛型方法
我试图定义并实现一个抽象setter,它将对象列表作为参数。以下是这个简单想法的要点:Java 用List参数实现泛型方法,java,generics,Java,Generics,我试图定义并实现一个抽象setter,它将对象列表作为参数。以下是这个简单想法的要点: public abstract class MyClass { public abstract void setThings(List<?> things); } public class Bar extends MyClass { private List<String> things; @Override public void setThing
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;
}
}
…以及其他一些人。我还发现了其他一些问题/答案,这些问题/答案接近于解决这个问题,但没有一个提供了可靠的答案(至少我不清楚)。我也通读了一遍,但没有用。我遗漏了什么?列出事物
是一个未知类型的列表
List 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; } }
setThings
,该方法采用列表
而不是列表
或列表
。所有这些都是不同的事情。看
最简单的解决方案是为抽象类引入泛型:
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;
}
}
公共抽象类MyClass{
公共抽象事物(列出事物);
}
公共类子类扩展了MyClass{
私人物品清单;
公共物品(列出物品){
这个东西=东西;
}
}
Oops,我刚刚忘记了示例中的abstract
类修饰符,但我在实际代码中确实有这个修饰符。我更新了问题以反映这一点。但是我需要在我的子类中有一个具体的类型。谢谢,我使用了你的示例,它工作得很好。我将不得不花更多的时间研究泛型,一些微妙之处对我来说仍然有点神秘,例如使用?
,T
,'E'等之间的区别。再多读一点也无法弥补!
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;
}
}
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;
}
}