java : return inherited child class type

标签 java

我正在尝试使用 Hibernate 构建 CRUD 系统。 我想为我的所有数据库对象构建一个接口(interface):

public abstract class ADBElem { }

这是数据库对象方法的示例(读取):

public static PrdProduct read(Integer id) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    PrdProduct product = null;
    product = (PrdProduct) session.get(PrdProduct.class, id);
    session.close();
    return product;
}

返回类型取决于继承的类,我如何将此方法放入我的抽象类中?

到目前为止我发现了什么:

public abstract class ADBElem<T> {
    public static T read(Integer id) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    T item = null;
    item = (T) session.get(T.class, id);
    session.close();
    return item;
 }

public class PrdProduct extends ADBElem<PrdProduct> {} 

但它不起作用,我收到此错误:无法对非静态类型 t 进行静态引用

最佳答案

在抽象类中,您必须添加方法签名,其返回类型是 PrdProduct 的父类(super class)或其实现的接口(interface)。然后,无论具体类型如何,具体方法都必须返回相同的抽象类型。

public abstract class ADBElem { 
    public static SomeSuperCLass read(Integer id);
}

public class PrdProduct extends SomeSuperCLass {
    public static SomeSuperCLassOrInterface read(Integer id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        PrdProduct product = null;
        product = (PrdProduct) session.get(PrdProduct.class, id);
        session.close();
        // return product which is also a `SomeSuperClass`
        return product;
    }
}

关于java : return inherited child class type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12924832/

相关文章:

java - 如何在Swing应用程序中实现JProgressBar?

java - maven 出现奇怪的编译错误 'actual and formal parameters differ in length'

java - 如何在挥杆中将鼠标指针更改为手指指针?

java - 字符串常量与字符串的运行时创建

java - 在 PagerAdapter 中开始新 Activity

java - Android.LibGDX。 3d 粒子系统不工作(广告牌)

java - 为 WebView 设置怪癖

java - 如何比较Java中的日期?

Java jar 文件无法识别从 gradle 添加的外部库

java - 登录 Facebook 后发送回 MainActivity