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

时间:2012-03-27 16:13:14

标签: java inheritance interface abstract-class

我有以下界面:

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。如何解决此错误?

4 个答案:

答案 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
    }
}