簡體   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