好的,所以我正在设置自己的XML序列化(我知道还有其他的,甚至有些内置于Java中,但我自己做是学习的,因为它非常棒)。我已经序列化了。我目前正在反序列化(读取 XML 文件并根据文件中的数据组装对象),并且在设置泛型类型时遇到问题。经过广泛的研究,我想出了如何获取类的泛型类型,以便在序列化时编写它们,但我不知道该怎么做:
Class c = Class.forName(string);
ArrayList<c> list = new ArrayList<c>();
我在 C# 中看到了一些答案,但显然 C# 比 Java 更通用,而且我无法在 Java 中复制解决方案。即使有反思,这甚至可以做到吗?
你不能。
Java 中的泛型只是编译时语法糖。这样你就不必像过去恐龙漫游 JVM 时那样将所有内容都投射到Object
,并为您提供了一些编译时类型检查。
编辑以添加:运行时保留了一些元数据,您可以通过反射来检查泛型类,但与您想要的完全不同。
不能在运行时设置泛型类型。编译时将擦除所有泛型类型信息。
请参阅以下文章以了解类型擦除:
类型纠删码堆栈溢出
类型擦除教程
否则你可以做什么(如果你的类数量有限).. 你可以通过使用"实例"运算符来检查对象,并根据数组列表中的位置
if(obj instance of abc)
ArrayList<abc> al = new ArrayList<abc>();
如果不是,你可以嵌套或切换
不,泛型仅在编译时,仅用于编译时类型检查,以允许您避免在编译时可以证明安全的强制转换。
想想吧。如果你能做你想做的事,那将是完全没有用的。拥有ArrayList<String>
的全部意义在于,当你从中获取一个元素时,编译器可以在编译时推断出它具有类型String
,因此它允许您将其分配给代码中的类型String
而无需强制转换。此外,如果您尝试在其中添加一个元素,编译器可以在编译时检查它是否属于 String
类型,否则不允许您这样做。
但是您需要一个在编译时未知的类型参数。因此,当您从中获取元素时,编译器对其类型一无所知,因此您只能将其分配给类型 Object
。当你尝试在其中放入某些内容时,编译器不知道它应该允许哪种类型,所以它必须允许所有类型?那么泛型就没有意义了。
因此,您应该只使用上限类型作为类型参数。喜欢ArrayList<Object> list = new ArrayList<Object>();