java - 如何在抽象父类(super class)中定义泛型列表?

标签 java generics

我正在尝试创建一个带有抽象方法的抽象类,它应该能够返回任何类型的列表,其中包含扩展 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/

相关文章:

java - 将带有音频的数组列表转换为 .wav 文件(Java)

java - Java 应用程序中的奇怪行为(由 Eclipse 启动时运行,但使用 java -jar 时出现错误)

c# - 从对象盒类型进行通用转换

java - Java 中以对象作为参数的泛型方法

c# - 为什么这种隐式转换不起作用?

java - SQL 查询从 MySQL 数据库表的日期期间检索数据,其中两个日期之一具有固定月份

java - JHipster Eclipse 插件错误

java - 如何找到存储在同一行mysql的2列中的日期差异

java - 遍历数据结构的元素而不是集合

具有两种类型的 C 泛型选择