Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型:从实现接口的抽象类继承_Java_Inheritance_Interface_Abstract Class - Fatal编程技术网

Java 泛型:从实现接口的抽象类继承

Java 泛型:从实现接口的抽象类继承,java,inheritance,interface,abstract-class,Java,Inheritance,Interface,Abstract Class,我有以下界面: public interface SingleRecordInterface<T> { public void insert(T object); } 最后,SpecificEntryBean定义为: public class SpecificEntryBean extends AbstractEntryBean { } 我有以下错误: 类型SpecificEntry必须实现继承的抽象方法SingleRecordInterface.insert(Abstr

我有以下界面:

public interface SingleRecordInterface<T> {
    public void insert(T object);
}
最后,SpecificEntryBean定义为:

public class SpecificEntryBean extends AbstractEntryBean {
}
我有以下错误:

类型SpecificEntry必须实现继承的抽象方法SingleRecordInterface.insert(AbstractEntryBean)


我不理解这个错误的原因,因为SpecificEntryBean扩展了AbstractEntryBean。如何修复此错误?

您还需要将抽象类设置为泛型:

public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}
公共抽象类AbstractEntry实现SingleRecordInterface{
}
那么对于你的具体课程:

public class SpecificEntry extends AbstractEntry {
    public void insert(SpecificEntryBean entry) {
        // stuff
    }
}
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
}
公共类SpecificEntry扩展了AbstractEntry{
}

更改为以下内容:

public abstract class AbstractEntry<EB extends AbstractEntryBean> implements SingleRecordInterface<EB> {
}
公共抽象类AbstractEntry实现SingleRecordInterface{
}

公共类SpecificEntry扩展了AbstractEntry{
公共作废插入(SpecificEntryBean条目){
//东西
}
}
公共抽象类AbstractEntry实现SingleRecordInterface{
}
公共类SpecificEntry扩展了AbstractEntry{
公共作废插入(SpecificEntryBean条目){
//东西
}
}

问题在于您的

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {}
因为Java需要完全相同的方法签名来覆盖给定的方法

您可以按照其他人的建议为类提供类型参数,也可以按照如下方式提供桥接(重载)方法:

//overloading
public void insert(SpecificBean object){
  insert((AbstractEntryBean) object);
}

这是我在stackoverflow中最喜欢的答案
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
    public void insert(SpecificEntryBean entry) {
        // stuff
    }
}
public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {}
@Override
public void insert(AbstractEntryBean object) {
    // TODO Auto-generated method stub
}
//overloading
public void insert(SpecificBean object){
  insert((AbstractEntryBean) object);
}