java - 由于缺少 GenericArrayType 而从 Java6 升级到 Java7 时出现 ClassCastException

标签 java generics java-7

我的代码在 Java 5 和 6 中运行,但是当我升级到 Java 7 时,我得到一个“java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.GenericArrayType”。

对于下面的代码:

public class A<T> {
  public Vector<Integer[]> arr;
}

System.out.println(((ParameterizedType)A.class.getField("arr").getGenericType()).getActualTypeArguments()[0]);
System.out.println(((ParameterizedType) A.class.getField("arr").getGenericType()).getActualTypeArguments()[0].getClass());

Java6 打印:

java.lang.Integer[]
class sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl

Java7 打印:

class [Ljava.lang.Integer;
class java.lang.Class

这种不同的行为破坏了我依赖泛型的代码。有人可以帮我理解为什么会发生这种情况以及如何获得 GenericArrayType来自 Vector<Integer[]> arr

最佳答案

GenericArrayType 的文档声明它表示一个数组类型,其组件类型是参数化类型或类型变量

在给定的示例中,数组类型是 Integer[]。组件类型 Integer 既不是参数化类型也不是类型变量。所以你的数组类型真的不应该用 GenericArrayType 来表示。

很明显,JRE6 的行为存在问题,但已得到修复。对不起。 :(

关于java - 由于缺少 GenericArrayType 而从 Java6 升级到 Java7 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11688312/

相关文章:

java - 需要帮助使这些类使用访问者模式和泛型

java - 泛型与泛型数组列表?

java - 如何将方法 StageHelper.getStages() 从 java 1.7 替换为 java 11

java - jdk7 : sun. font.fontManager 替换/如何从 fontname 获取文件名信息

java - Eclipse 搜索 String.isEmpty()

java - 如何分别为Nexus4 和Galaxy Nexus 布局?

java - 如何使 FXML 生成的按钮起作用

java - Java 泛型有没有办法采用需要实现 2 个接口(interface)的泛型参数?

c# - 使用 LINQ 选择字典 <T1, T2>

java - 如何在intellij中查看导入的jdk类文件的内容