我有一个接口,构建并提供为jar,java src和target = 1.5
interface IGetter {
int getInternalID(final long externId);
int getInternalID(long externId, char specifier);
}
我在实现此接口的java 1.8中实现了一个内部静态类
public static Calculator {
...
public static class LookupTable implements IGetter {
/* (non-Javadoc)
* @see com.mycompany.IGetter#getInternalID(long)
*/
@Override
public int getInternalID(long externId) {
....
return internId;
}
/* (non-Javadoc)
* @see com.mycompany.IGetter#getInternalID(long, char)
*/
@Override <-- Here compiler error; This method is not detected
as beeing in the interface.
public int getInternalID(long externalId, char specifier) {
return ...;
}
}
}
编译器未将第二个getInternal(long, char)
方法检测为接口方法。
单击包含界面的jar文件,甚至是eclipse中的类查看器,在方法概述的左窗格中显示缺少该方法,而在编辑器视图中,它显示该方法在界面中实现
有什么问题,是否允许界面中两种方法的名称相同?
为什么java编译器会编译接口? (src和target = java 1.5)
为什么java 1.8编译不能将它识别为接口方法。 (src和目标1.8)
编译器错误是:Calculator.LookupTable类型的方法getInternalID(long,char)必须覆盖或实现超类型方法Calculator.java
答案 0 :(得分:1)
原因是类路径中有另一个jar文件,该文件是使用旧版本的IGetter
接口编译的。
感谢用户发出嘘声,感谢他是否确定我导入了正确的界面。
答案 1 :(得分:1)
因为您使用的是Java 5,所以无法使用@Override
注释。它不适用于任何低于Java 6的版本。这就是为什么注释在旧版本中是可选的,因为如果强制它将会破坏向后兼容性。
在Java 5中: @Override
注释仅指超类。
在Java 6 +中: @Override
注释引用了超类和实现的方法。
您的代码发出错误,因为在Java 5中,这不是您在类中实现的方法的有效注释。删除它并重新编译。