一个接口有两个具有相同名称但签名不同的方法

时间:2015-08-10 17:11:09

标签: java interface method-signature

我有一个接口,构建并提供为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

2 个答案:

答案 0 :(得分:1)

原因是类路径中有另一个jar文件,该文件是使用旧版本的IGetter接口编译的。

感谢用户发出嘘声,感谢他是否确定我导入了正确的界面。

答案 1 :(得分:1)

因为您使用的是Java 5,所以无法使用@Override注释。它不适用于任何低于Java 6的版本。这就是为什么注释在旧版本中是可选的,因为如果强制它将会破坏向后兼容性。

在Java 5中: @Override注释仅指超类。

在Java 6 +中: @Override注释引用了超类和实现的方法。

您的代码发出错误,因为在Java 5中,这不是您在类中实现的方法的有效注释。删除它并重新编译。