まず、クラスSimpleGenericClass
はabstractであるため、サブクラス化されることを意図しています。
第 2 に、これはジェネリッククラスであるため、クラス内のどこかでジェネリック パラメータT
をフィールドの型としてほぼ確実に使用できます。
public abstract class SimpleGenericClass<T...> {
T x;
}
ここで最初に興味深いのは、それT
がboundedであることです。それは、 または の一部のサブクラスT extends SimpleGenericClass<?>
のみであると宣言されているためです。thr についても尋ねました。これはワイルドカードとして知られており、ワイルドカードに関する Java チュートリアル にかなり適切な説明があります。あなたの場合、これは「SimpleGenericClass of unknown」であると言えます。たとえば、は のスーパークラスではないため、Java で必要です。SimpleGenericClass<?>
SimpleGenericClass<?>
?
SimpleGenericClass<Object>
SimpleGenericClass<String>
2 番目に興味深いのT
は、SimpleGenericClass
はある種のものであるため、クラスは 再帰構造を定義している可能性が高いということです。私の頭に浮かぶのはSimpleGenericClass
、あらゆる種類の特殊なノード タイプでサブクラス化されるように設計された (抽象) ノード タイプであるツリー (式ツリーと考えてください) です。
UPDATE 自己境界ジェネリックに関するこのSOの質問は、あなたに役立つかもしれません。
更新 2
先に進み、これをどのように使用できるかを示すコードをいくつかまとめました。アプリは何もしませんが、コンパイルを行い、一般的な境界が意味のある制約をどのように提供できるかを示します。
public abstract class Node<T extends Node<?>> {
public abstract T[] getChildren();
}
class NumberNode extends Node {
int data;
public Node[] getChildren() {return new Node[]{};}
}
class IdentifierNode extends Node {
int data;
public Node[] getChildren() {return new Node[]{};}
}
class PlusNode extends Node {
NumberNode left;
NumberNode right;
public NumberNode[] getChildren() {return new NumberNode[]{};}
}
ここで良いのは、 !NumberNode[]
の有効な戻り値の型であることです。PlusNode.getChildren
それは実際には重要ですか?わかりませんが、かなりクールです。:)
これは最大の例ではありませんが、質問はどちらかと言えばオープンエンドでした (「そのようなものは何に使用されるのでしょうか?」)。もちろん、ツリーを定義する方法は他にもあります。