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

この異なる動作により、ジェネリックに依存するコードが壊れています。なぜこれが起こるのか、そしてGenericArrayTypeからGenericArrayTypeを取得する方法を誰かが理解するのを手伝ってくれますかVector<Integer[]> arr?

4

1 に答える 1

6

のドキュメントには、コンポーネントタイプがパラメータ化されたタイプまたはタイプ変数のいずれかでGenericArrayTypeある配列タイプを表すと記載されています。

与えられた例では、配列型はInteger[]です。コンポーネント型、Integerは、パラメータ化された型でも型変数でもありません。したがって、配列型は実際には。で表されるべきではありませんGenericArrayType

したがって、明らかにJRE6の動作にはバグがあり、修正されました。ごめん。:(

于 2012-07-27T13:19:06.230 に答える