0

次のコードを書くためのよりエレガントな方法があるかどうかを尋ねたいと思います:

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); 

しかし、より複雑なコードでは変数が多すぎます...

4

1 に答える 1

2

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

クラス(RoutingObject、LeafObjectなど)をネストするのではなくスタンドアロンクラスにするか、内部クラスをインスタンス化するには、最初に外部クラスをインスタンス化する必要があります。次に、次の構文を使用して、外部オブジェクト内に内部オブジェクトを作成します。

MTree mtree = new MTree(); MTree.Nodeノード=mtree.newNode();

参照: http ://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

あなたの例からあなたが何を達成しようとしているのかよくわかりませんが、私の推測では、ネストされたクラスを使用するべきではないということです。お役に立てれば。

于 2012-04-07T00:35:59.203 に答える