0

我正在尝试使用动态提供给我的方法的泛型类型作为给定数据结构的类型,类似于函数中的映射,但在声明时只使用一个类。它更像是一个带键的 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 对象只是为了看看它是否有效,但无法让它工作。

有一些首选的方法吗?

是的,我知道其中一些处理往往有点繁重,但我需要它来做我正在做的事情。

4

2 回答 2

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给 a List<?>。那么为什么要使用泛型呢?

List<String>(请注意,在 java 中,泛型主要用于确保编译时的类型安全。在运行时,a和 a没有区别,List<Integer>因为在编译代码时类型信息会被删除)。

于 2013-09-30T14:25:19.507 回答
1

类型擦除将阻止这样的事情起作用。基本上,您不能使用仅在运行时才知道的类型来初始化泛型,因为 JVM 不知道泛型类型。因此,该类型必须在编译时可用。

于 2013-09-30T14:20:32.283 回答