如何在java中运行时设置ArrayList的泛型类型?

时间:2013-02-03 08:46:20

标签: java generics reflection

好的,所以我正在建立自己的XML序列化(我知道还有其他的,甚至是一些内置于Java的,但我自己也是在学习,因为它非常棒)。我有序列化了。我目前正在进行反序列化(读取XML文件并根据文件中的数据组装对象),我遇到了设置泛型类型的问题。经过广泛的研究,我想出了如何获得类的泛型类型,以便我可以在序列化时编写它们,但我不知道如何做到这一点:

Class c = Class.forName(string);
ArrayList<c> list = new ArrayList<c>();

我在C#中已经看到了一些这方面的答案,但显然C#比Java更具通用性,而且我无法用Java复制那里的解决方案。即使用反射,这甚至可以做到吗?

4 个答案:

答案 0 :(得分:13)

你不能。

Java中的泛型只是编译时语法糖。它使得你不必像往常一样在{J}漫游JVM时为Object投射所有内容,并为你提供一些编译时类型检查。

编辑添加:在运行时保留了一些元数据,您可以通过反射来检查一个通用类,但没有喜欢你想要的。

答案 1 :(得分:0)

您无法在运行时设置泛型类型。 所有泛型类型信息都在编译时擦除。

请参阅以下文章以了解类型擦除:

Type Erasure StackOverflow

Type Erasure Tutorial

答案 2 :(得分:0)

否则你可以做什么(如果你的课程数量有限)..你通过使用'instance of'运算符并根据你的arraylist中的那个地方来检查对象

if(obj instance of abc)
    ArrayList<abc> al = new ArrayList<abc>();

你可以嵌套if else或切换

答案 3 :(得分:0)

不,Generics仅在编译时,仅用于编译时类型检查,以允许您避免在编译时被证明是安全的强制转换。

想一想。如果你能做你想做的事,那就完全没用了。比如说,ArrayList<String>的全部意义在于,当你从中获取一个元素时,编译器可以在编译时推断它有类型String,因此它允许你分配它在没有强制转换的情况下在代码中键入String。此外,如果您尝试向其中添加元素,编译器可以在编译时检查它是String类型,或者不允许您这样做。

但是你想要一个在编译时不知道的类型参数。因此,当您从中获取元素时,编译器对其类型一无所知,因此您只能将其分配给类型Object。当你试图把东西放进去的时候,编译器不知道它应该允许什么类型,所以它必须允许所有类型?那么泛型就没有意义了。

因此,您应该只使用上限类型作为类型参数。与ArrayList<Object> list = new ArrayList<Object>();

一样