Java 通过超级接口使用@Override

Java 通过超级接口使用@Override,java,interface,Java,Interface,更新:在过去,maven只是编译级的问题 问题涉及@Override注释和超级接口 这是一个简单的方法,因为它得到了真正的问题是@Override注释的范围没有扩大到上层接口 下面是一些简单的代码来理解这个问题: public abstract interface CrudDao<T> { void update(T bean); T get(Object... pk); void delete(Object ...pk); T create(T

更新:在过去,maven只是编译级的问题

问题涉及@Override注释和超级接口

这是一个简单的方法,因为它得到了真正的问题是@Override注释的范围没有扩大到上层接口

下面是一些简单的代码来理解这个问题:

public abstract interface CrudDao<T>
{
    void update(T bean);

    T get(Object... pk);

    void delete(Object ...pk);

    T create(T bean);
}



public interface BeanDao extends CrudDao<Bean>
{
    Bean moreSpecificGetMethod();
    void moreSpecificUpdateMethod();
}

public class BeanDaoImpl implements BeanDao {

    @Override
    public void update(Bean bean){}

    @Override
    public Bean get(Object... pk){}

    //... Rest of the methods 
}
公共抽象接口CrudDao
{
void更新(tbean);
T get(对象…pk);
作废删除(对象…主键);
T创建(T bean);
}
公共接口BeanDao扩展了CrudDao
{
Bean MoreSpectGetMethod();
void moreSpecificUpdateMethod();
}
公共类BeanDaoImpl实现BeanDao{
@凌驾
公共void更新(Bean){}
@凌驾
公共Bean get(对象…pk){}
//…其余的方法
}
编译器说应该在BeanDao接口中创建这些方法。为什么不从超级接口解析方法?

公共接口BeanDaoImpl实现BeanDao{

@Override
void update(Bean bean);

@Override
Bean get(Object... pk);

//... Rest of the methods  }
@Override
void update(Bean bean);

@Override
Bean get(Object... pk);

//... Rest of the methods  }
将实现更改为扩展。接口不实现其他接口,而是扩展它们

如果您这样做,您所指的错误就会消失

应该是:

公共接口BeanDaoImpl扩展了BeanDao{

@Override
void update(Bean bean);

@Override
Bean get(Object... pk);

//... Rest of the methods  }
@Override
void update(Bean bean);

@Override
Bean get(Object... pk);

//... Rest of the methods  }

@Override Javadoc状态

指示方法声明旨在重写方法 超类中的声明。如果使用此 注释类型,但不重写超类方法,编译器 生成错误消息时需要

在您的情况下,我们有一个问题:

  • 它是一个需要
    扩展的接口(而不是
    实现BeanDao
    并删除
    更新
    /
    获取
    方法),或者
  • 它是一个类(不是抽象类),这意味着您
    实现BeanDao
    并实现重写的方法

    • 对您发布的代码的明显更正如下:

      public class BeanDaoImpl implements BeanDao {
          @Override
          public void update(Bean bean) {}
      
          @Override
          public Bean get(Object... pk) {
              return null;
          }
      }
      

      方法需要是公共的并且有一个主体。

      编译器和
      @Override
      注释处理器都很好。在使用javac(在命令行上)进行编译期间,下面列出了
      BeanDaoImpl
      类的更新方法的消息:

      info.example.BeanDaoImpl中的update(info.example.Bean)无法实现 更新info.example.CrudDao中的(T);尝试分配较弱的访问权限 特权;是公开的

      原因是CrudDao中的
      update
      方法实际上是公共的。根据:

      接口主体中的每个方法声明都是隐式公开的

      在公开
      BeanDaoImpl.update
      方法时,错误消息会消失。这同样适用于来自其他方法的类似错误消息

      Eclipse项目设置也有问题,因为您使用的是JDK 1.6要运行Eclipse,您不需要自动让编译器不抱怨
      @Override
      注释处理。您需要在项目设置的
      Java编译器
      面板中将项目的
      编译器符合性级别设置为1.6。值为1.5将导致Eclipse注释过程或者抱怨没有实现的方法,而事实上,这些方法已经实现了,但是在超级接口中声明了,就像在您的案例中一样


      编译器符合性级别设置的问题部分是由于初始版本-它仅限于超类,不包括作为超类型的接口。这在Java 6中已修复,但编译器符合性级别1.5使Eclipse注释处理器将
      @Override
      注释方法视为需要的方法你确定它是
      公共接口BeanDaoImpl
      而不是
      公共类BeanDaoImpl
      吗?对不起,当然不是公共接口BeanDaoImpl,而是公共类BeanDaoImpl,更正了。我在eclipse中使用了最新的1.6 JDK和默认符合性设置。现在使用
      BeanDaoImpl
      作为一个非抽象类,你不能有没有body的方法……而且这些方法必须是
      公共的
      是为了“简化”吗问题是?如果将BeanDaoImpl作为抽象,将方法作为公共,那么相同的代码不会给出任何编译错误。它工作正常。
      BeanDaoImpl
      是一个没有接口的类我很早就编辑了这个错误,我正在工作,只是复制粘贴了接口。很抱歉,这个实现显然是inte的实现这两种方法都是公开的,并且都有主体。