3

いくつかのSuperClass私は抽象的なジェネリックメソッドを持っています:

protected abstract <T extends Foo> T getFoo();

私の中で私はそれを次のSubClassようにオーバーライドしようとします:

@Override
protected SubFoo getFoo() {             
    return new SubFoo();
}

どこpublic class SubFoo extends Foo

私のサブクラスでgetFooは、次のエラーが発生します。

「型安全性:型SubClassからのgetFoo()の戻り型SubFooは、型SuperClassからのTに準拠するために、チェックされていない変換が必要です。」

私の質問は次のとおりです。

1)これが安全でないシナリオはありますか?

2)そうでない場合、コンパイラはそれを理解できるべきではありませんか?コンパイラがコンパイル時にSubFooがFooのサブクラスであることを理解するのを妨げているのは何ですか?

3)このようなことを達成する方法はありますが、警告はありませんか?

4

1 に答える 1

9

はい、これは安全ではなく違法です。作成したSuperClass宣言により、サブクラスではなく呼び出し元が必要なサブタイプを選択できるため、の実装では適切に実装されません。SuperClassFooSubClass

代わりに、メソッド: 、、および。だけでなく、それ自体Tのジェネリックパラメーターとして持つ必要があります。SuperClassSuperClass<T extends Foo>SubClass extends SuperClass<SubFoo>

于 2013-02-26T17:57:50.797 に答える