【问题标题】:How to consolidate these functions into a generic如何将这些函数合并为一个泛型
【发布时间】:2012-04-20 12:37:00
【问题描述】:

我有几个函数...

@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 会按照我将其作为第二个参数传递给createNamedQuery() 的方式工作吗?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    您需要通过在方法返回类型之前添加类型参数列表(在本例中为&lt;T&gt;)来将您的方法声明为泛型。然后只需传入正确类型的类对象作为参数即可:

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

    【讨论】:

    • 你能解释一下为什么我需要public &lt;T&gt; List&lt;T&gt; 而不仅仅是public List&lt;T&gt; 吗?
    • 因为你需要指出&lt;T&gt;是什么类型,你可以像这样强制T扩展另一个类:&lt;T extends Number&gt;。通过声明&lt;T&gt;,您表明它可以是任何扩展 Object 的类型(即所有类型)
    • 明白了!此外,contentDao.findAll("User")contentDao.findAll(new User()) 似乎不是这个函数正在寻找的......
    • @Webnet 不,你应该打电话给contentDao.findAll(User.class)
    • @Webnet,User.class 是该类的类令牌,可用于运行时访问有关该类的所有已知信息。包括它的名字、成员、超类等等。new User()是这个类的一个实例,它不直接包含这个元信息。 "User" 是一个字符串,它恰好是一个类的简单(非限定)名称,但对于运行时系统来说,它一点也不明显,甚至本身也不是唯一的(没有完整的包名)。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2019-01-14
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      相关资源
      最近更新 更多