2012-04-07 21 views
0

は、私は次のコードを記述するために、よりエレガントな方法があればお願いしたいと思い属性:Javaのコレクションを持つ多型は

public class MTree { 
    class MTreeObject { 
     double[] vector; 
    } 

    class RoutingObject extends MTreeObject { 
     double radius; 
    } 

    class LeafObject extends MTreeObject { 
     int id; 
    } 

    class Node { 
     LinkedList<MTreeObject> list; 
    } 

    class InnerNode extends Node { 
     LinkedList<RoutingObject> list; 
    } 

    class LeafNode extends Node { 
     LinkedList<LeafObject> list; 
    } 

    public static void main(String[] argv) { 
     MTreeObject object = new RoutingObject(); 
     Node node = new InnerNode(); 
     ((InnerNode)node).list.add((RoutingObject)object); 

    } 
} 

問題は、私は、例えば持っている場合:

class Result { 
    Node node; 
} 

を呼び出してから、メイン・コール

public static void main(String[] argv) { 
    Result result = new Result(); 
    MTreeObject object = new RoutingObject(); 
    result.node = new InnerNode(); 
    result.((InnerNode)node).list.add((RoutingObject)object);  
} 

私が望むように動作しません。まあ私も行うことができます:

newnode = result.node 
((InnerNode)newnode).list.add((RoutingObject)object); 

が、その後、私は私のより複雑なコードでも多くの変数を持っているでしょう...

+1

これはジェネリックの仕事です。 –

+0

あなたのクラスデザインは絡まっています:それらの内部クラスを自分のファイルに移動してトップレベルのクラスにします。その後、ジェネリックを使用します。 – Bohemian

答えて

2

問題は、あなたがのmtreeの内部クラスとして、すべてのクラスを宣言しています。内部クラスのインスタンスは、外部クラス(MTree)のインスタンス内にのみ存在できます。

ネストされていないクラス(RoutingObject、LeafObjectなど)をスタンドアロンクラスにするか、 に内部クラスをインスタンス化するようにしてください。まず、外部クラスをインスタンス化する必要があります。次に、この構文で外側のオブジェクト内の内側オブジェクトを作成します。

MTree mtree = new MTree(); MTree.Node node = mtree.new Node();

を参照してください:あなたが達成しようとしているものをあなたの例からhttp://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

かなりわからない、私の推測で最高の推測では、あなただけの入れ子になったクラスを使うべきではないです。お役に立てれば。

+0

もっと複雑なプログラムでMTreeの属性を使って作業しやすくするために内部クラスがありますが、とにかくお礼を申し上げます。 –

+0

私は少し違って解決しましたが、とにかくあなたの答えは役に立ちました。 –

関連する問題