关于java:如何实现Comparable接口以及为什么要实现它

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

重写 Comparable 接口的 compareTo() 方法的最佳方法是什么?此外,当我们可以编写自己的 compareTo() 方法而不需要实现时,为什么我们还需要实现 Comparable 接口。以下面的 Seat 类为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
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为例。签名是

1
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?

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

出于这个原因,像上面的 Collections.sort 这样的方法通常会提供第二个签名,它采用 Comparator:

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

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

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