我有以下界面:
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。如何解决此错误?
答案 0 :(得分:35)
您还需要使抽象类具有通用性:
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}
然后为你的具体课程:
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
}
答案 1 :(得分:3)
更改为以下内容:
public abstract class AbstractEntry<EB extends AbstractEntryBean> implements SingleRecordInterface<EB> {
}
和
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
public void insert(SpecificEntryBean entry) {
// stuff
}
}
答案 2 :(得分:2)
问题在于你的
声明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);
}
答案 3 :(得分:1)
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
public void insert(SpecificEntryBean entry) {
// stuff
}
}