今天,我正在尝试学习 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()仍然合法吗?
本教程试图通过一个简单的示例来介绍接口的概念,但最终却产生了误导。
\n\n以这段代码为例:
\n\npublic 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}\nRun 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鉴于是equals()由每个类的直接或间接超类实现的,因此您不必提供 的实现。ObjectObjectequals()
| 归档时间: |
|
| 查看次数: |
871 次 |
| 最近记录: |