好的,所以我正在建立自己的XML序列化(我知道还有其他的,甚至是一些内置于Java的,但我自己也是在学习,因为它非常棒)。我有序列化了。我目前正在进行反序列化(读取XML文件并根据文件中的数据组装对象),我遇到了设置泛型类型的问题。经过广泛的研究,我想出了如何获得类的泛型类型,以便我可以在序列化时编写它们,但我不知道如何做到这一点:
Class c = Class.forName(string);
ArrayList<c> list = new ArrayList<c>();
我在C#中已经看到了一些这方面的答案,但显然C#比Java更具通用性,而且我无法用Java复制那里的解决方案。即使用反射,这甚至可以做到吗?
答案 0 :(得分:13)
你不能。
Java中的泛型只是编译时语法糖。它使得你不必像往常一样在{J}漫游JVM时为Object
投射所有内容,并为你提供一些编译时类型检查。
编辑添加:在运行时保留了一些元数据,您可以通过反射来检查一个通用类,但没有喜欢你想要的。
答案 1 :(得分:0)
答案 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>();