3

ジェネリックに問題があり、いくつかのジェネリック情報を反映しようとしているときに型が消去されていると思います。

リフレクションを行うためにhttp://www.artima.com/weblogs/viewpost.jsp?thread=208860に基づくクラスを使用していますが、それは問題ではありません。

以下のコードは、この問題を示しています。

private <U extends MyClass1> U doSomething(MyClass2<U> p) {
     Class<U> classIWant = null;
     for (Class<?> c : GenericTypeUtils.getTypeArguments(MyClass2.class, p.getClass()))      {
        if (MyClass1.class.isAssignableFrom(c)) {
            classIWant = c.asSubclass(MyClass1.class);
            break;
        }
    }
}

残念ながらライン

classIWant = c.asSubclass(MyClass1.class);

次のエラーが表示されます

java: incompatible types
  required: java.lang.Class<U>
  found:    java.lang.Class<capture#4 of ? extends MyClass1>

そして、それは本当に私を混乱させます。U は MyClass1 を拡張するため、U は MyClass1 です。

明らかに、私がここで理解していない型消去の一部があります-誰か助けてください。ところで、これはJava 1.7.0_40です

ありがとう

コンラッド・ウィンチェスター

4

2 に答える 2

1

ClassJava コンパイラは、オブジェクトcがジェネリック型と一致することを保証できませんU。型消去のため、型の安全性を保証し、Classからの復帰を確実にするのはコンパイラc.asSubclass次第ですClass<U>が、それはできません。

asSubclassメソッドはを返しますClass<? extends U>Classクラスでは、に渡されるU型を表します。あなたがそれを呼び出すとき、それは. ただし、コンパイラは、この戻り値の型が独自の宣言と一致することを保証できません。それらは の異なるサブクラスである可能性があります。ClassasSubclassc<U extends MyClass1>MyClass1

が を返すことを保証できる場合は、次のようにキャストします。c.asSubclassClass<U>Class<U>

classIWant = (Class<U>) c.asSubclass(MyClass1.class);

「チェックされていないキャスト」という警告が表示されます。これは、コンパイラが が本当に であることを保証できないためClass<U>です。. _ ClassCastException_ Uこれは、型の安全性を自分で保証できる場合にのみ行ってください。

于 2013-11-04T17:12:51.043 に答える