我正在尝试使用动态给定的泛型类型作为给定数据结构的类型,类似于函数中的映射,但在声明时只使用一个类。它更像是带键的ArrayList。所以,我试图做的是:
private final ArrayList<T extends Object> findGroup(final String key, final String classType)
{
Class<?> c = Class.forName(classType);
ArrayList<c.class> listOfStuff = new ArrayList<>();
return listOfStuff;
}
我收到的错误发生在.class调用上。 我已经尝试了c.getClass(),以及从c.class创建另一个Class对象,看它是否有效,但无法使它工作。
是否有一些首选方法?
是的,我知道其中一些往往有点繁重,但我需要它来做我正在做的事情。
答案 0 :(得分:6)
如果在编译时已知类对象本身,则可以按如下方式完成:
private final <T> List<T> findGroup(final String key, final Class<T> type)
{
ArrayList<T> listOfStuff = new ArrayList<T>();
// TODO: fill listOfStuff here (e.g. using key and type)
return listOfStuff;
}
如果你必须在运行时基于String加载类,那么在这里使用泛型是没有意义的,因为调用findGroup
的方法本身并不知道List
的实际类型在编译时。因此,您只能将findGroup
的结果分配给List<?>
。那么为什么要使用泛型?
(注意,在java中,泛型主要用于确保编译时的类型安全。在运行时,List<String>
和List<Integer>
之间没有区别,因为当代码获取时类型信息会被删除编译)。
答案 1 :(得分:1)
Type erasure会阻止此类工作。基本上,您不能使用仅在运行时知道的类型初始化泛型,因为JVM不了解泛型类型。因此,类型必须在编译时可用。