Les*_*ter 0 java generics java-ee
问题标题感觉非常笨拙.我很感激编辑.
我正在尝试创建一个可重用的查询来返回由指定List的对象指定的某种对象String.
这不起作用,但我想它会说明我想要做的事情:
public List<?> getAll(String type) {
Class clazz = Class.forName(type);
return (List<clazz>) em.createQuery("SELECT t from " + type + " t").getResultList();
}
Run Code Online (Sandbox Code Playgroud)
尝试使用类型的类:
public <T> List<T> getAll(Class<T> type) {
return em.createQuery("SELECT t from " + type.getSimpleName() + " t").getResultList();
}
Run Code Online (Sandbox Code Playgroud)
请注意,这仍将生成警告,因为getResultList()返回原始列表.
编辑:
如果你只有一个完全限定的类名,即你需要调用Class.forName(),那么在编译时就无法知道该类 - 并且由于泛型(几乎)只是一个编译时功能(提示:类型擦除),它们将无济于事在这种情况下.
您仍然可以使用如下检索的类调用泛型方法Class.forName():
List<?> l = getAll( Class.forName( typeName ));
Run Code Online (Sandbox Code Playgroud)
您可能也不需要获取类对象本身,如果它只是用于查询(但是,首先检查字符串是现有类的名称可能是有意义的).在这种情况下,您的方法可能如下所示:
public List<?> getAll(String type) {
return em.createQuery("SELECT t from " + type + " t").getResultList();
}
Run Code Online (Sandbox Code Playgroud)
此变体还允许您传入完全限定的类名或实体名称,即它会更灵活一些.
或者你可以返回List<Object>,这将允许你向列表中添加更多的对象(但要注意,你可以添加任何东西).
话虽这么说,我会尽可能使用第一个选项,并在编译时使用具体类型(或至少某些接口)时将第二个选项作为回退.
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |