Java 通过超级接口使用@Override
更新:在过去,maven只是编译级的问题 问题涉及@Override注释和超级接口 这是一个简单的方法,因为它得到了真正的问题是@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
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的实现这两种方法都是公开的,并且都有主体。