0

ジェネリック抽象クラスとして実装されているJavaで記述されたannアルゴリズムのプロファイルを作成しようとしていますが、インスタンス化する方法がわかりません。

Eclipseで「KdTree型をインスタンス化できません」というエラーが表示されますが、これはあまり役に立ちません。このクラスをインスタンス化してテストできるようにする方法について何かアイデアはありますか?

クラスの定義とコンストラクター:

public abstract class KdTree<T> {    
    private KdTree(int dimensions, Integer sizeLimit) {
        this.dimensions = dimensions;
    }
}

それをインスタンス化する私の試み:

public class test_robo {
    public void run_test() 
    {
        KdTree<Integer> tree = new KdTree<Integer>(1,1);
    }
}

KdTreeの完全なコードへのリンク http://robowiki.net/wiki/User:Rednaxela/kD-Tree

4

5 に答える 5

6

まず第一に、抽象クラスをインスタンス化することはできません。

あなたが提供したリンクのコードを見ました。KdTree<T>すでにそこにある基本クラスの実装はほとんどありません。

  1. WeightedSqrEuclid
  2. 加重マンハッタン
    ..。

それがあなたが探しているものではない場合は、基本クラスを拡張し、必要に応じてそれらすべての抽象メソッドを実装します。

于 2012-08-09T14:57:17.573 に答える
3

抽象クラスを直接インスタンス化することはできません。抽象として宣言されている理由は、それ自体が使用されることを意図していないためです。最初に、その抽象メソッドの実装を提供する必要があります。

抽象ベースから独自のクラスを継承し、その抽象メソッドを実装してから、クラスをインスタンス化する必要があります。クラスのインスタンスは、自動的にその抽象ベースのインスタンスになります。

public class ProfilerTree extends KdTree<Integer> {
    public ProfilerTree(int dimensions, Integer sizeLimit) {
        super(dimensions, sizeLimit);
    }
    ...
    // Implement abstract methods of KdTree<Integer> here
}
...
KdTree<Integer> tree = new ProfilerTree(1,1);
于 2012-08-09T14:55:34.130 に答える
1

抽象クラスをインスタンス化することはできません。抽象とは、実際にはそれ自体では意味がないことを意味するため、常に拡張してメソッドを実装する必要があります。

インターフェイスとは異なり、抽象クラスには静的および最終ではないフィールドを含めることができ、実装されたメソッドを含めることができます。このような抽象クラスは、部分的な実装を提供し、実装を完了するためにサブクラスに任せることを除いて、インターフェースに似ています。抽象クラスに抽象メソッド宣言のみが含まれている場合は、代わりにインターフェイスとして宣言する必要があります。複数のインターフェースは、それらが何らかの方法で相互に関連しているかどうかに関係なく、クラス階層内のどこにでもクラスによって実装できます。たとえば、ComparableまたはCloneableについて考えてみてください。比較すると、抽象クラスは、実装の一部を共有するために最も一般的にサブクラス化されます。単一の抽象クラスは、多くの共通点(抽象クラ​​スの実装部分)を持つ同様のクラスによってサブクラス化されます。

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.htmlを参照してください

于 2012-08-09T14:56:02.237 に答える
1

次のように、匿名のサブクラスを作成することでインスタンス化できます。

KdTree<Integer> tree = new KdTree<Integer>(1,1)
{
    @Override
    public void myAbstractMethodName()
    {
        //do something!
    }
};

それ以外の場合は、独自の実装を生成できます。

private class KdTreeSub extends KdTree<Integer>
{
    public KdTreeSub()
    {
        super(1, 1);
    }
}

そして後でそれを呼ぶ

public void myMethod()
{
   ...
   KdTree<Integer> kdtree = new KdTreeSub();
   ...
}

これは、抽象クラスが完全なクラスではないためです。それらはそれらの一部、通常はメソッドが欠落しています。このメソッドは、「abstract」識別子でマークされています。

public abstract int read();

この背後にある考え方は、他の部分を処理するクラスを構築できるということです。

public byte[] read(int len)
{
    byte[] b = new byte[len];
    for(int i = 0; i < b.length; i++) b[i] = read();
    return b;
}

そして、新しいクラスの作成を簡素化します。

于 2012-08-09T14:57:27.120 に答える
1

クラスは、現状では、インスタンス化されることを意図していませんでした。これは、具体的な実装のための定型コードを格納することを目的としています。リンクには、で始まる4つがありますWeightedSqrEuclid

これらをインスタンス化するには、たとえばnew WeightedSqrEuclid<Integer>(1,1)、を使用するか、一般的なコードをプロファイリングする場合は、を拡張する独自のクラスを記述しますKdTree

ただし、後者の場合、同じファイルにサブクラスを作成するか、のコンストラクターをKdTree少なくともに変更する必要がありprotectedます。これは、このタイプのサブクラスを作成するにはKdTree、実装でのコンストラクターの1つを呼び出す必要があるためです。

于 2012-08-09T15:06:15.067 に答える