[英]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>
已经很少。
如果这不是您想要的,请扩展基类并根据需要实现所有这些抽象方法。
您不能直接实例化一个抽象类。 声明为抽象的原因是它本身并不意味着要使用-您必须首先提供其抽象方法的实现。
您需要从抽象库继承您自己的类,实现其抽象方法,然后实例化您的类。 类的实例自动是其抽象库的实例。
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.