0

问题标题感觉很笨拙。我很感激编辑。
我正在尝试创建一个可重用的查询来返回List由指定的特定类型的对象String
这行不通,但我想它会清楚我要做什么:

public List<?> getAll(String type) {
    Class clazz = Class.forName(type);
    return (List<clazz>) em.createQuery("SELECT t from " + type + " t").getResultList();
}
4

1 回答 1

5

尝试使用类型的类:

public <T> List<T> getAll(Class<T> type) {
  return em.createQuery("SELECT t from " + type.getSimpleName() + " t").getResultList();
}

请注意,这仍然会产生警告,因为getResultList()返回一个原始列表。

编辑

如果您只有一个完全限定的类名,即您需要调用Class.forName(),则无法在编译时知道该类-并且由于泛型(几乎)只是编译时功能(提示:类型擦除),它们将无济于事在这种情况下。

您仍然可以使用这样检索的类调用泛型方法Class.forName()

List<?> l = getAll( Class.forName( typeName ));

如果仅用于查询,您可能也不需要获取类对象本身(但是,首先检查字符串是否是现有类的名称可能是有意义的)。在这种情况下,您的方法可能如下所示:

public List<?> getAll(String type) {
   return em.createQuery("SELECT t from " + type + " t").getResultList();
}

此变体还允许您传入完全限定的类名或实体名,即它会更灵活一些。

或者,您可以 return List<Object>,这将允许您向列表中添加更多对象(但请注意,您可以添加任何内容)。

话虽如此,我会尽可能使用第一个选项,当具体类型(或至少某些接口)在编译时未知时,我会使用第二个选项作为后备。

于 2013-10-23T08:17:40.167 回答