为什么不在接口 Comparator 中实现所有方法?

Tea*_* NG 5 java comparator

今天,我正在尝试学习 Java 8 中的一些特性,特别是关于 Lambda 表达式。我像这样创建了一个新的 Comaparator:

Comparator<String> strCom = new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return 0;
    }
};
Run Code Online (Sandbox Code Playgroud)

当我阅读 Comparator 界面中的代码时,我感到困惑。通过接口 Comparator 有两个方法compare()equals(),我们不需要全部实现。我已经找到了一些原因,我们并不需要实现方法equals()方法 在这里。但我也在 javadocs 中阅读

如果您的类声称实现了一个接口,则该接口定义的所有方法都必须出现在其源代码中,然后该类才能成功编译什么是接口?

那么,有人可以帮助我理解这一点吗?不要覆盖equals()仍然合法吗?

biz*_*lop 3

本教程试图通过一个简单的示例来介绍接口的概念,但最终却产生了误导。

\n\n

以这段代码为例:

\n\n
public interface MyInterface {\n    public void foo();\n    public void bar();\n}\n\npublic class Super {\n    public void foo() { System.out.println("foo"); }\n}\n\npublic class Sub extends Super implements MyInterface {\n    public void bar() { System.out.println("bar"); }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是完全有效的代码,尽管事实上Sub仅显式实现了其中一个MyInterface方法。很容易看出为什么这是有效的:foo()已经由 实现Super,并且该实现由 继承Sub

\n\n

确切的规则是这样

\n\n
\n

除非声明的类是抽象类,否则每个直接超级接口的所有抽象成员\n 方法都必须通过此类中的声明或继承的现有方法\n 声明来实现 (\xc2\xa78.4.8.1)\n来自直接超类或直接超接口,因为非抽象类不允许具有抽象方法 (\xc2\xa78.1.1.1)。

\n
\n\n

虽然该规则仅讨论直接超类,但从技术上讲,它也适用于间接超类,因为方法继承在层次结构中向下冒泡。

\n\n

鉴于是equals()由每个类的直接或间接超类实现的,因此您不必提供 的实现。ObjectObjectequals()

\n