まず、クラスSimpleGenericClass
が抽象であるため、サブクラス化することを意味します。
genericクラスです。つまり、クラス内でフィールドのタイプとして汎用パラメータT
を使用していることがほぼ確実にわかります。
public abstract class SimpleGenericClass<T...> {
T x;
}
今ここ最初興味深いのは、T
がが有界であるということです。 T extends SimpleGenericClass<?>
と宣言されているため、SimpleGenericClass<?>
またはSimpleGenericClass<?>
のサブクラスしか指定できません。あなたはまたthr ?
について尋ねました。これはワイルドカードとして知られており、the Java Tutorial on Wildcardsにはかなり良い説明があります。あなたの場合、これは「SimpleGenericClass of Unknown」と言うでしょう。例えば、SimpleGenericClass<Object>
はSimpleGenericClass<String>
のスーパークラスではないため、Javaでは必要です。
二興味深いのは、しかしT
はある種のSimpleGenericClass
ているので、あなたのクラスはおそらく再帰的な構造を定義するよりもあるということです。私の頭に浮かぶのは、SimpleGenericClass
がすべての種類の特殊なノードタイプでサブクラス化されるように設計された(抽象的な)ノードタイプのツリー(表現木を考える)です。
更新This SO question on self-bounded genericsが役に立ちます。
UPDATE 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
の有効な戻り値の型であるということです!それは実際に重要なのでしょうか?いい考えはありませんが、それはかなりクールです。 :)
これは最高の例ではありませんが、質問はむしろオープンエンドでした(「このようなものは何のために使用されるのでしょうか」)。もちろん、ツリーを定義する他の方法もあります。
両方とも「シンプル」か「サンプル」か、それとも異なるクラスであると思われますか? –
ごめんなさい、そのSimpleGenericClass - 私はそれを更新しました。ありがとう – anonymous