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

如何实现可比较的接口以及为什么要实现它

贺跃
2023-03-14

重写Compariable接口的compareTo()方法的最佳方法是什么?此外,当我们可以编写自己的compareTo()方法而无需实现时,为什么还要实现可比较的接口呢。以以下座椅类别为例:

public class Seat {
        private final String seatNumber;
        private double price;

        public Seat(String seatNumber, double price) {
            this.seatNumber = seatNumber;
            this.price = price;
        }

        public int compareTo(Seat seat) {
            return this.seatNumber.compareToIgnoreCase(seat.getSeatNumber());
        }
}

尽管我们没有实现可比接口,但上述工作仍然有效,那么我们为什么要实现它呢?

共有1个答案

葛嘉悦
2023-03-14

当我们可以编写自己的compareTo()方法而不需要实现时,为什么还要实现可比较的接口

Collections.sort为例。签名是

public static <T extends Comparable<? super T>> void sort(List<T> var0)

泛型类型参数意味着我们只能对与自身(或子类型)相似的事物列表进行排序。例如,我们可以对字符串列表进行排序,因为字符串实现了可比较的

如果没有定义此约束的接口,则此方法不可能存在。

重写可比接口的compareTo()方法的最佳方法是什么?

这完全取决于你所在的班级。如果它没有明确的自然顺序,那么也许你不应该。一个座位可以按数字或价格排序。武断地选择一个并不一定有意义。

出于这个原因,通常会使用上述集合之类的方法。排序将提供第二个签名,该签名使用比较器:

public static <T> void sort(List<T> var0, Comparator<? super T> var1)

这意味着我们不必任意定义座位是自然按数字还是价格排序。我们可以有一段代码,使用一个比较器按价格排序,另一段完全独立的代码使用另一个比较器按座位号排序。

实现Comparable的一个优点是,您不需要像使用Comparator一样,公开内部类的详细信息来确定实例的排序。

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

  • 问题内容: 我不确定如何在我的抽象类中实现类似的接口。我有以下示例代码可用来尝试解决这个问题: 我有一个测试类,该类将创建Animal类型的对象,但是我希望在该类中具有一个可比的接口,以使发现的年纪高于低位。我不知道如何去解决这个问题。 问题答案: 您只需要定义即p。然后,您必须以自己喜欢的方式实现该方法。 使用的实现,具有较高级别的动物将获得更高的顺序。我希望你的想法和这个例子。

  • 我不确定如何在我的抽象类中实现一个可比较的接口。我有下面的示例代码,我正在使用它来尝试和得到我的头脑周围: 我有一个测试类,它将创建动物类型的对象,但是我想在这个类中有一个类似的接口,这样更早的发现排名就会更高。不过,我不知道该怎么做。

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

  • 今天,我试图学习Java8中的一些特性,特别是关于Lambda表达式。我创建了一个新的Comaparator,如下所示: 当我阅读比较器接口内的代码时,我感到困惑。虽然通过接口比较器有两个方法compare()和equals(),但我们不需要全部实现它们。我已经找到了一些原因,为什么我们不需要在这里实现方法equals()。但我也读过javadocs 如果类声明实现接口,则该接口定义的所有方法必须