为什么在覆盖 compareTo() 方法时使用 Comparable 接口中的 compareTo()?

Why use compareTo() from Comparable Interface when overriding the compareTo() method?

我一直在谷歌搜索,最接近的回复(不是答案)是 here,但我对回复感到困惑。我正在尝试使用 Collection.sort() 对一些狗名进行排序,因此我需要学习使用 Comparable 接口。我的问题:

1) 当我 "override" compareTo() 时为什么需要使用来自接口的 compareTo()?
2)如果 Comparable 接口的 compareTo() 是默认方法,为什么它的方法前面没有 "default" 关键字? Java SE 8 Menu

这是部分代码:

Collections.sort(list);   
for(Dog a: list)   // printing the sorted list of names
     System.out.print(a.getDogName() + ", ");

这里是 class Comparable 接口的实现:

class Dog implements Comparator<Dog>, Comparable<Dog> {
   private String name;
   private int age;

   Dog() {}

   Dog(String n, int a) {
      name = n;  age = a;
   }

   public String getDogName() {
      return name;
   }

   public int getDogAge() {
      return age;
   }

   public int compareTo(Dog d) {
      return (this.name).compareTo(d.name);  //###.....my question
   }

   // Override Comparator Interface's compare() to sort "ages"
   public int compare(Dog d, Dog d1) {
      return d.age - d1.age;
   }
}

why I need to use the compareTo() that came from the interface when I "override" the compareTo()?

这样您就可以根据您使用的数据结构自定义逻辑,因此在您的情况下,您使用的是 Dog 对象,该对象无法按集合 API 默认排序,因为它们仅适用于原始数据类型排序不在自定义对象上。

因此它要求覆盖 compareTo() 并提供自定义逻辑,因为您的排序关键字是字符串 "name" 您可以使用其 compareTo() 方法进行排序。

2) If the compareTo() from Comparable interface is a default method, why doesn't it has a "default" keyword in front of the method?

因为在原始数据类型排序的情况下 Collections.sort() 内部使用 Arrays.sort() 并且 Comparable 接口中没有默认实现 compareTo() 方法

这里有一些事情要考虑。

一个Dog对其他DogComparable。它本身并不是比较两个 other Dog 的东西。

因此,实施 Comparable 是 "more correct"。

而且您在两种方法之间存在冲突。

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

Sorts the specified list into ascending order, according to the natural ordering of its elements.

因此,Collections.sort(dogs); 将对您的列表进行排序。

static <T> void sort(List<T> list, Comparator<? super T> c)

Sorts the specified list according to the order induced by the specified comparator.

这就是您使用该方法的方式。

Collections.sort(dogs, new Comparator<Dog>() {
    @Override
    public int compare(Dog d1, Dog d2) {
        return d1.compareTo(d2); // Call the Comparable method
    }
)};

当然,您可以实现按年龄排序的内部方法

return Integer.compare(d1.getAge(), d2.getAge());