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

Zam*_*anò 0 java comparable

覆盖Comparable Interface的compareTo()方法的最佳方法是什么?另外,为什么我们在没有实现的情况下编写自己的compareTo()方法时需要实现Comparable Interface.以下面的Seat类为例:

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());
        }
}
Run Code Online (Sandbox Code Playgroud)

上面的工作虽然我们没有实现Comparable Interface,但为什么要实现它呢?

Mic*_*ael 7

当我们在没有实现的情况下编写自己的compareTo()方法时,为什么我们需要实现Comparable Interface

举个例子Collections.sort.签名是

public static <T extends Comparable<? super T>> void sort(List<T> var0)
Run Code Online (Sandbox Code Playgroud)

泛型类型参数意味着我们只能对与自身(或子类型)相当的事物列表进行排序.例如,我们可以对字符串列表进行排序,因为String实现Comparable<String>.也就是说,字符串知道它是否应该自然地落在另一个字符串之前或之后.

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


覆盖Comparable Interface的compareTo()方法的最佳方法是什么?

这完全取决于你正在使用的课程.如果它没有明确的自然顺序那么也许你不应该.座位可以按数量或价格进行分类.任意选择一个并不一定有意义.

出于这个原因,通常上述方法Collections.sort将提供第二个签名,其中包括Comparator:

public static <T> void sort(List<T> var0, Comparator<? super T> var1)
Run Code Online (Sandbox Code Playgroud)

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

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