繁体   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