【问题标题】:Generics: Inheriting from an abstract class that implements an interface泛型:从实现接口的抽象类继承
【发布时间】:2012-04-11 05:12:41
【问题描述】:

我有如下界面:

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

【问题讨论】:

    标签: java inheritance interface abstract-class


    【解决方案1】:

    您还需要将抽象类设为通用:

    public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
    }
    

    那么对于你的具体类:

    public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
    }
    

    【讨论】:

    • 这是我在stackoverflow中最喜欢的答案
    【解决方案2】:

    更改如下:

    public abstract class AbstractEntry<EB extends AbstractEntryBean> implements SingleRecordInterface<EB> {
    }
    

    public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
        public void insert(SpecificEntryBean entry) {
            // stuff
        }
    }
    

    【讨论】:

      【解决方案3】:
      public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
      }
      
      public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
          public void insert(SpecificEntryBean entry) {
              // stuff
          }
      }
      

      【讨论】:

        【解决方案4】:

        问题出在你的声明中

        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);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-03
          • 2020-03-02
          • 2020-05-14
          • 1970-01-01
          • 2018-04-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多