我正在尝试创建一个带有抽象方法的抽象类,它应该能够返回任何类型的列表,其中包含扩展 SuperBean
的项目。 .
然后我想创建一个可以将项目添加到该列表的通用类。 示例:
class AbstractService<T extends SuperBean> {
//this is what I'm aiming for
void add(T item) {
// "is not applicable for the arguments (T)"
superBean.getSublist().add(item);
}
}
abstract class SuperBean {
abstract List<? extends SuperBean> getSublist();
}
class MyBean1 extends SuperBean {
List<MyBean2> sublist;
List<MyBean2> getSublist() {
return sublist;
}
}
class MyBean2 extends SuperBean {
List<MyBean3> sublist;
List<MyBean3> getSublist() {
return sublist;
}
}
问题:我必须如何定义 abstract getSublist()
类,以便我可以添加任何 T item
这是 SuperBean
的实现?
最佳答案
您需要在 AbstractService
中添加您的泛型:
// Add S to be T's type parameter Add <S> to SuperBean here
class AbstractService<S extends SuperBean, T extends SuperBean<S>> {
// I'm assuming superBean is defined here.
T superBean;
//this is what I'm aiming for
void add(S item) {
superBean.getSublist().add(item);
}
}
接下来,您需要制作 SuperBean
泛型,其子类定义了泛型类型参数 <T>
:
abstract class SuperBean<T extends SuperBean> {
// Now you can define the abstract method properly:
abstract List<T> getSublist();
}
每个子类都适本地定义了它的泛型类型参数:
class MyBean1 extends SuperBean<MyBean2> {
List<MyBean2> sublist;
List<MyBean2> getSublist() {
return sublist;
}
}
和MyBean2
定义类似:
class MyBean2 extends SuperBean<MyBean3> {
List<MyBean3> sublist;
List<MyBean3> getSublist() {
return sublist;
}
}
这允许您按如下方式声明服务:
AbstractService<MyBean2, MyBean1> service1 = new AbstractService<MyBean2, MyBean1>();
AbstractService<MyBean3, MyBean2> service2 = new AbstractService<MyBean3, MyBean2>();
关于java - 如何在抽象父类(super class)中定义泛型列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18257159/