Java6升级到Java7时出现ClassCastException,原因是缺少GenericArrayType。

8
我的代码在Java 5和6中运行良好,但当我升级到Java 7时,出现了“java.lang.ClassCastException:java.lang.Class无法转换为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

这种不同的行为破坏了我依赖泛型的代码。请有人帮忙理解为什么会发生这种情况,以及如何从 Vector<Integer[]> arr 中获取 GenericArrayType
1个回答

6
GenericArrayType的文档说明它表示一个组件类型为参数化类型或类型变量的数组类型。在给定的示例中,数组类型是Integer[]。组件类型Integer既不是参数化类型也不是类型变量。因此,您的数组类型实际上不应该由GenericArrayType表示。显然,JRE6的行为有缺陷,并已修复。抱歉。 :(

Java bug http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7151486 描述了类似的情况。我在 Java 6 和 Java 7 之间遇到了这种行为变化。虽然可以编写代码绕过此问题,但是很麻烦。 - Richard Neish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接