gpt4 book ai didi

java - 如何动态地将某个泛型类型分配给List?

转载 作者:行者123 更新时间:2023-12-01 17:19:49 26 4
gpt4 key购买 nike

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

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

最佳答案

尝试使用类型的类:

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

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

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

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

关于java - 如何动态地将某个泛型类型分配给List?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19536311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com