簡體   English   中英

泛型:從實現接口的抽象類繼承

[英]Generics: Inheriting from an abstract class that implements an interface

我有以下界面:

public interface SingleRecordInterface<T> {
    public void insert(T object);
}

我有下面的抽象類(沒有提到方法插入):

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {
}

我有具體的課程:

public class SpecificEntry extends AbstractEntry {
    public void insert(SpecificEntryBean entry) {
        // stuff
    }
}

最后,SpecificEntryBean定義為:

public class SpecificEntryBean extends AbstractEntryBean {
}

我有以下錯誤:

SpecificEntry類型必須實現繼承的抽象方法SingleRecordInterface.insert(AbstractEntryBean)

鑒於SpecificEntryBean擴展了AbstractEntryBean,我不明白這個錯誤的原因。 我該如何解決這個錯誤?

您還需要使您的抽象類通用:

public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}

然后為您的具體課程:

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
}

更改為以下內容:

public abstract class AbstractEntry<EB extends AbstractEntryBean> implements SingleRecordInterface<EB> {
}

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
    public void insert(SpecificEntryBean entry) {
        // stuff
    }
}

問題出在你的聲明中

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {}

這是您為類型參數T定義什么是類型參數(AbstracEntryBean)的地方。

因此,T是AbstracEntryBean ,當您打算覆蓋此方法以最終實現它時,您需要為該方法提供確切的方法簽名。 在這種情況下:

@Override
public void insert(AbstractEntryBean object) {
    // TODO Auto-generated method stub
}

由於Java需要完全相同的方法簽名來覆蓋給定的方法。

您可以像其他人建議的那樣為您的類提供類型參數,或者提供橋接(重載)方法,如下所示:

//overloading
public void insert(SpecificBean object){
  insert((AbstractEntryBean) object);
}
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
    public void insert(SpecificEntryBean entry) {
        // stuff
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM