如何将这些功能合并为通用

时间:2012-04-19 19:23:00

标签: java generics

我有一些功能......

@Override
public List<ContentType> findAllContentTypes() {
    return this.emf.createEntityManager()
                   .createNamedQuery("ContentType.findAll", ContentType.class)
                   .getResultList();
}

@Override
public List<Status> findAllStatus() {
    return this.emf.createEntityManager()
                   .createNamedQuery("Status.findAll", Status.class)
                   .getResultList();
}

事实上,我有大约12种可以获得各种不同的东西。我想采用这些函数并制作一个通用函数来替换所有这些函数。

我能想到的最好的方法就是做findAll("Language")之类的事情。我开始做...

public List<T> findAll(String objectName) {
    return this.emf.createEntityManager()
                   .createNamedQuery(objectName+".findAll", objectName)
                   .getResultList();
}

问题(除了我的IDE因不知道如何对T做什么而不合适)是我不确定如何取代该字符串并将其传递给ContentType.class

我错过了什么阻止Netbeans识别T

objectName将{I}}作为第二个参数传递给createNamedQuery()吗?

2 个答案:

答案 0 :(得分:4)

您需要在方法返回类型之前添加类型参数列表(在本例中为<T>),将方法声明为通用方法。然后只需将正确类型的类对象作为参数传递:

public <T> List<T> findAll(Class<T> clazz) {
    return this.emf.createEntityManager().createNamedQuery(
            clazz.getSimpleName()+".findAll", clazz).getResultList();
}

答案 1 :(得分:2)

这样的事情可以解决问题:

public <T> List<T> findAll(Class<T> klass) {
    return this.emf.createEntityManager().createNamedQuery(klass.getSimpleName()+".findAll", klass).getResultList();
}