覆盖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,上面的工作仍然有效,那么我们为什么要实现它呢?
答案 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
一样公开内部类详细信息以确定实例排序。