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

时间:2018-04-20 16:28:30

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

即使我们没有实现Comparable Interface,上面的工作仍然有效,那么我们为什么要实现它呢?

1 个答案:

答案 0 :(得分:7)

  

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

Collections.sort为例。签名是

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

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

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

  

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

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

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

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

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

实施Comparable的一个好处是,您不需要像使用Comparator一样公开内部类详细信息以确定实例排序。