9

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

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

我在 C# 中看到了一些答案,但显然 C# 比 Java 更通用,我无法在 Java 中复制这些解决方案。即使有反思,这甚至可以做到吗?

4

4 回答 4

14

你不能。

Java 中的泛型只是编译时语法糖。它使您不必Object像过去恐龙在 JVM 中漫游时那样来回转换所有内容,并为您提供一些编译时类型检查。

编辑添加:在运行时保留了一些元数据,您可以通过反射来检查泛型类,但与您想要的完全不同。

于 2013-02-03T08:49:26.063 回答
1

您不能在运行时设置泛型类型。所有泛型类型信息在编译时被删除。

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

类型擦除 StackOverflow

类型擦除教程

于 2013-02-03T08:51:10.673 回答
0

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

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

你可以嵌套 if else 或 switch

于 2013-02-03T08:55:19.743 回答
0

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

想想看。如果你能做你想做的,那将是完全没有用的。比如说,拥有的全部意义ArrayList<String>在于,当您从中获取一个元素时,编译器可以在编译时推断它具有 type String,因此它允许您将其分配给String代码中的类型而无需强制转换。此外,如果您尝试向其中添加元素,编译器可以在编译时检查它是否属于 type String,否则不会让您这样做。

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

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

于 2013-02-03T20:39:11.607 回答