だからClassName
は、一般的なパラメータT
を持っており、このパラメータは、特定の要件に合わせて必要があり、この場合には意味ある特定のタイプS
を拡張しますT
は、S
を継承する必要があります。この場合の興味深いのは、S
です。
S
はClassName<?>
であるため、T
は、ClassName
からワイルドカードを継承する必要があります。ワイルドカードの場合、疑問符はMichael Markidisがあなたの質問にコメントしたリンクを見てください。
本当の楽しみは今、この定義
public abstract class ClassName<T extends ClassName<?>>
が再帰ジェネリック型定義のそれぞれで独立しできることです。だから、それは価値があるものは何でものために
ClassName<ClassName<ClassName<ClassName<?>>>> test;
のようなものを持つことができます:)
EDIT:比較して比較的容易
ClassName2<T extends ClassName<?>> extends ClassName<T>
を考えるのthatsを。
ClassName
を継承したいが汎用引数を "破棄"しないので、
ClassName
が受け入れるものを受け取ります。この場合は
T extends ClassName<?>
です。
extends ClassName<T>
では、コンパイラは、の)
T
が(これは明らかに
ClassName
の定義を覚えています)の
T
に適合するかどうかをチェックします。また
、我々はあなたが欲しいしかし、今あなたは二つのタイプを混在させることができ、ClassName<?>
をClassName2<?>
拡張している:
ClassName2<ClassName<ClassName<ClassName<?>>>> test2;
ClassName2<ClassName<ClassName2<ClassName<?>>>> test3;
はしかし、あなたが持っているならば、パブリック(
class ClassName3<T extends ClassName3<?>> extends ClassName<T>
言いますアブストラクモディファイアはここでの一般的な動作に実際には影響しません)、
ClassName3<ClassName3<ClassName3<ClassName3<?>>>> test4;
ClassName2<ClassName<ClassName3<ClassName3<?>>>> test5;
ClassName
とClassName2
は、ClassName3
を継承していません。
ああ、私はこの文脈で "再帰的"を聞くのが怖かった)))実際に次のクラス私はpublic abstract class ClassName2> ClassName を継承しています。 –
@Evgeniy Mishustinはあなたのコメントに応じて私の答えを拡張しました:-)私はType Erasureのヒントがあなたを助けることができてうれしいです – GreenThor