多态数据结构Java

时间:2013-09-30 14:17:02

标签: java generics reflection data-structures polymorphism

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

是否有一些首选方法?

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

2 个答案:

答案 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不了解泛型类型。因此,类型必须在编译时可用。