繁体   English   中英

如何实例化泛型抽象类

[英]how to instance generic abstract class

我试图剖析用Java编写的an算法,该算法作为通用抽象类实现,但我不知道如何实例化它。

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

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

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

  1. 加权平方欧氏
  2. 曼哈顿加权
    ...

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

您不能直接实例化一个抽象类。 声明为抽象的原因是它本身并不意味着要使用-您必须首先提供其抽象方法的实现。

您需要从抽象库继承您自己的类,实现其抽象方法,然后实例化您的类。 类的实例自动是其抽象库的实例。

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

您不能实例化一个抽象类。 实际上,抽象意味着它本身没有意义,因此必须对其进行扩展并实现其方法。

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

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

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

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

并简化创建新类的过程。

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

您可以通过new WeightedSqrEuclid<Integer>(1,1)实例化这些实例,或者,如果您想分析通用代码,则编写自己的扩展KdTree的类。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM