Comparable接口如何实现,为什么要实现

How to Implement the Comparable Interface and Why Should We Implement It

覆盖可比较接口的 compareTo() 方法的最佳方法是什么?此外,当我们可以编写自己的 compareTo() 方法而无需实现时,为什么我们还需要实现 Comparable 接口。以下面的座位class为例:

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());
        }
}

即使我们没有实现 Comparable 接口,上面的方法仍然有效,那么我们为什么要实现它呢?

why would we ever need to implement the Comparable Interface when we can write our own compareTo() method without the implementation

Collections.sort为例。签名是

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

通用类型参数意味着我们只能对与其自身(或子类型)具有可比性的事物列表进行排序。例如,我们可以对字符串列表进行排序,因为 String 实现了 Comparable<String>。也就是说,一个字符串知道它应该自然落在另一个字符串之前还是之后。

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


What is the best way to override the compareTo() method of the Comparable Interface?

这完全取决于您正在使用的class。如果它没有明确的自然顺序,那么也许你不应该这样做。座位可以按编号或价格排序。任意选择一个不一定有意义。

出于这个原因,上述 Collections.sort 等方法通常会提供第二个签名,该签名采用 Comparator:

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

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

实施 Comparable 的一个优点是您不必像使用 Comparator.[=23 那样必须公开内部 class 详细信息来确定实例排序=]