当前位置: 首页 > 知识库问答 >
问题:

为什么不在接口比较器中实现所有方法?

琴元凯
2023-03-14

今天,我试图学习Java8中的一些特性,特别是关于Lambda表达式。我创建了一个新的Comaparator,如下所示:

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

当我阅读比较器接口内的代码时,我感到困惑。虽然通过接口比较器有两个方法compare()和equals(),但我们不需要全部实现它们。我已经找到了一些原因,为什么我们不需要在这里实现方法equals()。但我也读过javadocs

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

有人能帮我理解吗?不重写equals()仍然合法吗?

共有2个答案

从元明
2023-03-14

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

以这段代码为例:

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只显式实现了MyInterfaces方法之一。很容易看出为什么这是有效的:foo()已经由Super实现,而该实现由Sub继承。

确切的规则如下:

除非所声明的类是抽象的,否则每个直接超级接口的所有抽象成员方法必须通过该类中的声明或从直接超类或直接超级接口继承的现有方法声明来实现(§8.4.8.1),因为非抽象类不允许有抽象方法(§8.1.1.1)。

虽然该规则只讨论直接超类,但从技术上讲,它也适用于间接超类,因为方法继承会在层次结构中逐渐减少。

假定equals()是由Object实现的,并且Object是每个类的直接或间接超类,您不必为equals()提供实现。

上官自明
2023-03-14

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

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

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

 类似资料:
  • 我们知道,如果我们想创建一个类的对象,就必须实现接口的所有方法。但是为什么不需要在java中同时实现接口的和? 我同意目的已经解决了,但即使如此,如果我们重写(),为什么不强制重写()?

  • 我想制作一个实现比较器接口的比较器类。在类中,我想根据它们的ID比较我的2个员工对象。到目前为止,我制作的员工类是: 我完全被困住了,不知道该怎么办。有人能帮忙吗?

  • 重写Compariable接口的compareTo()方法的最佳方法是什么?此外,当我们可以编写自己的compareTo()方法而无需实现时,为什么还要实现可比较的接口呢。以以下座椅类别为例: 尽管我们没有实现可比接口,但上述工作仍然有效,那么我们为什么要实现它呢?

  • 问题内容: Java新手。在Android应用程序上工作时进行学习。我正在实现一个Comparator来对文件列表进行排序,而android docs 说一个Comparator应该实现Serializable: 建议比较器实现可序列化。 这是这里的Serializable接口。 我只想对文件列表进行排序。我为什么要实施此方法,或者为什么对任何比较器都应采用该方法? 问题答案: 这不仅是Andro

  • 接口在Java11中获得了一个新的静态方法:。 此方法返回int: 如果两个字符序列相等,则值为0;如果第一个字符序列在词典编纂上小于第二个字符序列,则为负整数;或者,如果第一个字符序列在词典上大于第二个字符序列,则为正整数。 这听起来就像是可比的。然而,Java团队显然选择了不让CharSequence可比。为什么不呢?我无法理解这种逻辑。 什么是关于,这将不是一个适当的适合?

  • 我是java新手,试图理解一些概念。这是一段我不懂的代码。 我知道这是怎么回事,但不明白为什么这是允许的。因此,我的问题是: 从java文档中,比较器[T]是一个接口。比较器[水果]怎么样?我将假设它是一个类,因为它必须覆盖比较函数。 为什么可以在{}中使用非参数构造函数和类定义来初始化FruitName比较器?我在比较器[T]的javadoc中没有找到这样的构造函数声明。 如有任何意见,将不胜感