更新:回到过去,这只是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接口中创建方法。为什么不从超级接口解析方法?
答案 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;
}
}
方法需要公开并且有一个正文。