[英]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.