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