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

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

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

我在C#中看到了一些这方面的答案,但显然C#比Java更通用,我无法用Java复制那里的解决方案。 即使用reflection,这甚至可以完成吗?

你不能。

Java中的generics只是编译时的语法糖。 这样就可以让你不必像过去那样在恐龙漫游JVM的过程中将所有内容都转换为Object ,并为你提供一些编译时类型检查。

编辑添加:在运行时保留了一些元数据,您可以通过reflection来检查generics类,但没有您喜欢的内容。

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

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

键入Erasure StackOverflow

键入Erasure教程

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

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

你可以嵌套if else或switch

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

想一想。 如果你能做你想做的事,那就完全没用了。 比如说,拥有ArrayList是,当你从中获取一个元素时,编译器可以在编译时推断出它有String类型,因此它允许你将它分配给String中的String类型。没有演员表的代码。 此外,如果您尝试向其中添加元素,编译器可以在编译时检查它是否为String类型,否则不允许您这样做。

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

因此,您应该只使用上限类型作为类型参数。 像ArrayListlist = new ArrayList();