4

そこでは、次のように記述しようとするまで、Javaジェネリックを理解していました。

class A{}

class B{
    A a;

    <T extends A> T getA(){ 
       return a; // does not compile
    }
}

型に互換性がないというコンパイル エラーが表示されます: T が必要ですが、A が見つかりました。

  1. エラーが発生するのはなぜですか?
  2. この種の Java ジェネリックの落とし穴について説明している記事への参照をいただければ幸いです。

ありがとうございました!

4

3 に答える 3

10

コンパイルされた場合、タイプセーフではありません。

B b = new B();
b.a = new A();

SubclassOfA foo = b.<SubclassOfA>getA();

aコンパイラはが のインスタンスになることを保証できずT、型消去のために実行時にチェックすることさえできないため、コンパイルされません。

一般に、Java Generics FAQはほぼすべてをカバーしています。

于 2012-08-05T13:03:48.050 に答える
2

動作するはずのバージョンは次のとおりです。

class B<T extends A>{
    T a;

    T getA(){ 
       return a;
    }
}

上記のように、クライアント コードは getA() が A のサブタイプを返すことを確認できますが、コンパイラはそれが A の正しいサブタイプであることも確認できます。

于 2012-08-05T13:05:33.790 に答える
-3

T extends A手段はそれ自体ではなく、そのTサブクラスでなければなりません。あなたの場合、次のようなものが必要です:AA

<T> T getA() {
    return a;
}

これはJavaジェネリックに関するチュートリアルです。

于 2012-08-05T13:06:20.490 に答える