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

时间:2016-11-22 12:17:10

标签: java comparator

今天,我正在尝试学习Java 8中的一些功能,具体是关于Lambda表达式。我创建了一个新的Comaparator:

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

当我在Comparator界面中读取代码时,我感到困惑。通过接口比较器有两个方法 compare() equals(),我们不需要实现所有这些方法。我找到了一些我们不需要实现方法 equals() here的原因。但我也读过javadocs

  

如果您的类声称实现了一个接口,那么该接口定义的所有方法必须在类成功编译之前出现在其源代码中 What Is an Interface?

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

2 个答案:

答案 0 :(得分:3)

实现不需要

,因为它是从Object类继承的,因为Java中的所有东西都是Object

正如您在文档中看到的那样,在Object类中已经定义了equal方法: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

如果你想检查两个比较器是否具有相同的数据并因此是“相等”,你只需要实现equals方法,但这可能不是你想要的,因为比较器通常不包含任何实例变量

答案 1 :(得分:2)

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

以此代码为例:

True

这是完全有效的代码,尽管public interface MyInterface { public void foo(); public void bar(); } public class Super { public void foo() { System.out.println("foo"); } } public class Sub extends Super implements MyInterface { public void bar() { System.out.println("bar"); } } 只显式实现了Sub方法之一。很容易理解为什么这是有效的:MyInterface已由foo()实现,并且该实现由Super继承。

确切的规则类似于this

  

除非被声明的类是抽象的,否则所有的抽象成员   必须实现每个直接超接口的方法(§8.4.8.1)   通过本课程中的声明或现有方法   声明继承自直接超类或直接   superinterface,因为不允许使用非抽象类   有抽象方法(§8.1.1.1)。

虽然规则只涉及直接超类,但从技术上讲,间接超类也是如此,因为方法继承会在层次结构中向下冒泡。

鉴于Subequals()实现,Object是每个类的直接或间接超类,您不必为Object提供实现。