使用带有超级界面的@Override

时间:2011-08-26 09:01:30

标签: 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 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 
}

编译器说应该在BeanDao接口中创建方法。为什么不从超级接口解析方法?

2 个答案:

答案 0 :(得分:1)

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

  info.example.BeanDaoImpl中的

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

原因是因为CrudDao中的update方法实际上是公开的。根据{{​​3}}:

  

接口正文中的每个方法声明都是隐式公开的。

在公开BeanDaoImpl.update方法时,错误消息消失了。对于来自其他方法的类似错误消息也是如此。

Eclipse项目设置也存在问题。仅仅因为你使用的是JDK 1.6运行Eclipse,你不需要自动让编译器不抱怨@Override注释处理。您需要在项目设置的Compiler compliance level面板中将项目的Java Compiler设置为1.6。值为1.5将导致Eclipse注释处理器抱怨未实现的方法,实际上,这些方法已经实现,但是在超级接口中声明,就像你的情况一样。

编译器合规性级别设置的问题部分归因于初始Java Language Specification - 它仅限于超类,并且不包括作为超类型的接口。这已在Java 6中修复,但@Override specification。编译器合规性级别1.5使Eclipse注释处理器将@Override带注释的方法视为需要存在于超类中的方法,而不是超类型。

答案 1 :(得分:0)

对您发布的代码的明显更正是:

public class BeanDaoImpl implements BeanDao {
    @Override
    public void update(Bean bean) {}

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

方法需要公开并且有一个正文。