0

I am trying to profile a ann algorithm written in Java that is implemented as a generic abstract class and I cant figure out how to instance it.

Eclipse gives me error "Cannot instantiate the type KdTree" which is not very helpful. Any ideas on how to instance this class so I can test it?

Class defination and constructor:

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

My attempt to instance it:

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

link to the full code for KdTree http://robowiki.net/wiki/User:Rednaxela/kD-Tree

4

5 回答 5

6

首先,你不能实例化一个抽象类。

我在您提供的链接中看到了代码;那里已经很少有基类的实现KdTree<T>

  1. 加权平方欧几里得
  2. 加权曼哈顿
    ...

如果这不是您想要的,请扩展基类并根据需要实现所有这些抽象方法。

于 2012-08-09T14:57:17.573 回答
3

You cannot instantiate an abstract class directly. The reason it is declared abstract is that it is not meant to be used by itself - you have to provide an implementation of its abstract methods first.

You need to inherit your own class from the abstract base, implement its abstract methods, and then instantiate your class. An instance of your class is automatically an instance of its abstract base.

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

您可以通过构造一个匿名子类来实例化它,如下所示:

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();
   ...
}

原因是抽象类不是完整的类。它们缺少其中的一部分,通常是一种方法。此方法标有“抽象”标识符:

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

你不能实例化一个抽象类。抽象实际上意味着它本身没有意义,所以它总是必须被扩展并实现它的方法。

与接口不同,抽象类可以包含非静态和最终的字段,它们可以包含已实现的方法。这种抽象类类似于接口,只是它们提供了部分实现,将其留给子类来完成实现。如果抽象类仅包含抽象方法声明,则应将其声明为接口。多个接口可以由类层次结构中任何位置的类实现,无论它们是否以任何方式相互关联。例如,想想 Comparable 或 Cloneable。相比之下,抽象类最常被子类化以共享实现部分。单个抽象类由具有很多共同点的类似类(抽象类的实现部分)子类化,

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

于 2012-08-09T14:56:02.237 回答
1

就目前而言,该类并不打算被实例化。它旨在存储具体实现的样板代码。您的链接中有 4 个,以WeightedSqrEuclid.

您可以简单地通过 eg 实例化它们,new WeightedSqrEuclid<Integer>(1,1)或者,如果您想分析通用代码,请编写您自己的扩展类KdTree

但是,在后一种情况下,您应该在同一文件中创建子类,或者将构造函数更改KdTree为至少protected. 这是因为,要创建这种类型的子类,您需要调用KdTree实现中的构造函数之一。

于 2012-08-09T15:06:15.067 回答