9

私はこのコードを持っています:

public <T extends Scrapper> Class<T> getScrapper() {
    return MyScrapper.class;
}

MyScrapperScrapperインターフェイスを実装するクラスです。なぜこれが機能しないのですか?JDK7 で次のエラーが発生します。

error: incompatible types
required: Class<T>
found:    Class<MyScrapper>
where T is a type-variable:
T extends Scrapper declared in method <T>getScrapper()

PS正直に言って、30〜40分全体を検索してみました。

更新:メソッドが機能するように宣言した場合public Class<? extends Scrapper> getScrapper() {。しかし、元の宣言がコンパイルされなかった理由はまだわかりません。どうしたの?

4

1 に答える 1

11

のようなジェネリック メソッドでは、メソッドgetScrapper()呼び出し元がメソッドの実際の型引数を決定します (Tこの場合)。呼び出し元はScrapperasの任意のサブタイプを選択できT、(常に を返すMyScrapper.class) メソッドは正しいクラスを返さないでしょう。

メソッドのシグネチャを考えると、このメソッドの呼び出し元は次のことができると期待します。

Class<MyOtherScrapper> c = foo.<MyOtherScrapper>getScrapper();

メソッドを return に変更するClass<? extends Scrapper>と、ジェネリック メソッドではなくなります...呼び出し元が設定する型パラメーターはありません。代わりに、署名は、メソッドが の未知のサブタイプのクラス オブジェクトを返すことを示しておりScrapperMyScrapper.classその法案に適合します。

于 2012-04-24T22:59:31.970 に答える