一个接口有两个方法,它们的名称相同但签名不同。

3

我有一个接口(Interface),已经以jar包、Java源代码的形式提供,目标版本为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编译器编译了该接口?(源代码和目标版本都是Java 1.5) 为什么Java 1.8编译器不将其识别为接口方法?(源代码和目标版本都是1.8)
编译器错误为:Calculator.LookupTable 类型的 getInternalID(long, char) 方法必须重写或实现一个超类型方法 Calculator.java。

2
你确定你正在导入正确的接口吗? - purring pigeon
return ...; 是什么意思?它是伪代码吗? - Amit.rk3
这是伪代码,@Henson:参数名称不是签名的一部分。 - AlexWien
@purring 嗯,我在类路径中还有另一个jar包,可能是使用旧版本的IGetter编译的。 - AlexWien
https://dev59.com/V3NA5IYBdhLWcg3wX8rk - jaco0646
类似的问题通常是要求具有相同方法签名的两个接口。而这是一个只有一个接口但具有不同方法签名的问题。 - AlexWien
2个回答

1
原因是类路径中有另一个使用旧版 IGetter 接口编译的 jar 文件。
感谢用户 purring pigeon 的提问,他问我是否确定导入了正确的接口。

1
因为您使用的是Java 5,所以不能使用@Override注释。它不适用于低于Java 6的任何版本。这就是为什么在旧版本中该注释是可选的,因为如果它是强制性的,它将会破坏向后兼容性。
在Java 5中:@Override注释仅适用于超类。
在Java 6+中:@Override注释适用于超类和实现方法。
您的代码出现错误,因为在Java 5中,这不是您在类中实现的方法的有效注释。请删除它并重新编译。

这不是原因。编译器是Java 1.8,库是1.5,看到我的自我回答:原因是旧版本的库。 - AlexWien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接