java:返回继承的子类类型

时间:2012-10-16 23:10:18

标签: java

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

public abstract class ADBElem { }

这是一个DB对象方法的示例(读取):

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进行静态引用

2 个答案:

答案 0 :(得分:2)

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

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;
    }
}

答案 1 :(得分:1)

使用静态(实用程序)方法,您只需键入方法即可。但是,无法获取泛型类型的Class,因此您也必须传入Class对象。

以下是如何将其编码为静态方法(无论是否键入类):

public static <T> T read(Integer id, Class<T> clazz) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    T object = (T) session.get(clazz, id);
    session.close();
    return object;
}

使用时,java将推断类型,因此您可以简单地编码(无需强制转换)这样的调用:

PrdProduct product = MyClass.read(1, PrdProduct.class);