2

私は次のように定義されたTreeNodeクラスを持っています:

class TreeNode<T extends MyClass> {
    public T element;
    public TreeNode<? extends MyClass> parent;
    public ArrayList<TreeNode<? extends MyClass>> children;
}

すべてのTreeNodeを拡張するジェネリック型変数に制限する簡単な方法があるかどうか知りたいMyClassですか?書き出すArrayList<TreeNode<? extends MyClass>>のはとても面倒です。ArrayList<TreeNode<T>>ツリーには、MyClassの継承が異なるノードを含めることができないため、私はそれを行うことはできません。

私はこのようなことをしようとしました: public static const Class NODE_CLASS = TreeNode<? extends TreeNode>.class;しかし、クラスオブジェクトの一部としてジェネリックを使用できるとは思いません。

C ++の同義語だtypedefと思います、 つまりtypedef TreeNode<? extends MyClass> NodeClass;

4

3 に答える 3

4

私のコメントはあなたを助けたようだったので、私はそれを答えとして投稿します:

Tツリー内のノード間で一致しない場合、ジェネリックを使用する意味がわかりません。それを考えると、elementただである必要がありますMyClass

于 2013-03-01T13:30:42.383 に答える
2

ジェネリックを維持したい場合は短縮することができます

ArrayList<TreeNode<? extends MyClass>> children;

List<TreeNode<?>> children;

はクラス定義に記述されているため、コンパイラは、拡張(またはそれ自体)extends MyClassのパラメータを持つツリーノードのみが許可されていると推測できます。MyClassMyClass

MyClassこれが唯一の既知の一般的なスーパークラスであるため、要素にアクセスするときに使用する必要があることに注意してください。

于 2013-03-01T13:31:10.847 に答える
1

FWIWは、型パラメーター(T extends MyClass)の境界をワイルドカード(? extends MyClass)の境界として繰り返すが、まったく何もしません。?(のように)無制限のワイルドカードを使用するだけTreeNode<?>です。

于 2013-03-01T13:30:18.197 に答える