0

木のように見える大きなデータ構造があります。すべてのツリー動作、リンク、リンク解除、ナビゲートなどを実装するルートクラスTreeElementがあります。ツリー内の実際のノードは、TreeElementクラスの特殊なサブクラスになります。特定の親ノードには、複数のタイプの子があります。サンプルツリーは次のとおりです。

NodeTypeA
+ NodeTypeB
  + NodeTypeC
  + NodeTypeC
+ NodeTypeB
  + NodeTypeC
+ NodeTypeD
  + NodeTypeE

ご覧のとおり、NodeTypeAにはタイプBとD(および場合によっては他の子)の子があり、NodeTypeBにはC(および場合によっては他の子)の子があります。NodeTypeDには、タイプE(および場合によっては他の子)の子があります。これらはすべてTreeElementのサブクラスです。専門のサブクラスは、彼らが持つことを許可されている子供の種類についてある程度の知識を持っています。

基本タイプTreeElementにはメソッドがあります

Vector getChildren(String kind, Class nodeType);

これは、kindの値でマークされ、渡されたクラスで指定されたクラスのすべての子で満たされたベクトルを返します。返されるベクトルには、渡されたクラスの要素が常に含まれます。問題は、右を実装しようとしていることです。一種の型安全性であり、これにJavaの動的型付け機能を使用する方法は私にはわかりません。

NodeTypeAクラスで、NodeTypeBの子を取得する次のようなメソッドが必要です。

Vector<NodeTypeB> getSpecialChildren() {
    Vector<NodeTypeB> vb = getChildren("special", NodeTypeB.class);
    return vb;
}

上記を書くと、Eclipseで型キャストが必要であるという警告が表示されます。だから私は型キャストを追加することができます:

Vector<NodeTypeB> getSpecialChildren() {
    Vector<NodeTypeB> vb = (Vector<NodeTypeB>) getChildren("special", NodeTypeB.class);
    return vb;
}

しかし、私には「不要なキャストを削除する」Eclipseの機能もあり、この機能はこのキャストを削除します。Eclipseがそれを不要と見なすのはちょっと奇妙に思えますが、そこにない場合は警告します。しかし、それはただの煩わしさです。

私が本当にやりたいのは、Javaの動的型メカニズム(これは「制限付き型パラメーター」ですか?)を使用して、これを正しく機能させることです。TreeElementクラスでgetChildrenメソッドを宣言して、このメカニズムを完全な型安全性で実現する方法を理解できません。クラスパラメーターを削除することを想定しています。どんな助けでもいただければ幸いです。

4

2 に答える 2

1

getChildrenの宣言を修正する方法は次のとおりです。

public <T extends TreeElement> Vector<T> getChildren(String string, Class<T> nodeType)

これにより、コンパイラは、使用時に型の警告が表示されたままになります。

ジェネリックスはコンパイル時の機能であり、実行時型の引数を指定しているため、そのメソッドの実装にはまだいくつかの警告がありますが、警告は少なくともそのメソッド内で分離されます。

于 2013-02-15T23:25:47.337 に答える
0

ネストされたセットツリーまたは隣接ツリーのいずれかの実装を検討する必要があります。非常に便利で、簡単に再利用できるジェネリックを使用したネストされたセットツリーのクラスをいくつか実行しました。

そのコアは次のようになります。

public class NestedSetTree<? extends NestedSetTree<T>> 

その場合、ノードはTだけです。getParent()、getAncestorOfType(NodeType type)などのすべての基本を実装できます。

于 2013-02-15T23:24:14.373 に答える