如何实例泛型抽象类

时间:2012-08-09 14:53:28

标签: java oop machine-learning

我正在尝试分析用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

5 个答案:

答案 0 :(得分:6)

首先,您无法实例化抽象类。

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

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

答案 1 :(得分: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);

答案 2 :(得分:1)

您无法实例化抽象类。摘要实际上意味着它本身没有意义所以它总是必须被扩展并且它的方法被实现。

与接口不同,抽象类可以包含非静态和最终的字段,并且它们可以包含已实现的方法。这些抽象类与接口类似,不同之处在于它们提供部分实现,将其留给子类来完成实现。如果抽象类只包含抽象方法声明,则应将其声明为接口。 多个接口可以由类层次结构中的任何位置的类实现,无论它们是否以任何方式彼此相关。例如,可以考虑可比较或可克隆。 相比之下,抽象类最常被子类化以共享实现部分。单个抽象类由具有许多共同点的类似类(抽象类的实现部分)进行子类化,但也有一些差异(抽象方法)。

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

答案 3 :(得分: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;
}

简化创建新课程。

答案 4 :(得分:1)

这个类目前并不是要实例化的。它旨在为具体实现存储样板代码。您的链接中有4个,从WeightedSqrEuclid开始。

您可以实例化这些,只需通过例如new WeightedSqrEuclid<Integer>(1,1),或者,如果您想要分析一般代码,请编写自己的类KdTree

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