“Comparable影响原始类,但Comparator不会”这句话的意思是什么?

5
// Original class Dog
  class Dog{
   String name;
   int age;

}

//Case 1
    class Dog implements Comparable<Dog>{
             //compareTo() implementation
        }


//Case2
      class Dog implements Comparator<Dog>{
       // compare() implementation
    }

//Case 3

    class DogNameComparator implements Comparator<Dog>{
    // compare() implementation
}



 Collection.sort(dogList);
    Collectios.sort(dogList,new DogNameComparator());
    Collection.sort(dogList,new Dog());

在第二种情况下,即使Comparator不修改原始类,但原始类实际上仍然被修改了,这是真的吗?
如果我没有正确理解概念,请给我指点。


你的例子有缺陷(或不完整),第二个例子本身并没有提供“Comparator”(事实上这使得区别难以看出)。但请注意,第三个例子与“Dog”无关。 - Elliott Frisch
1个回答

3

Comparable 接口只能被实现在原始类上,因此它只有一个实现(除非你使用子类重写 compareTo 方法)。而 Comparator 接口不需要被实现在原始类上,因此可以有多个实现。

第二种情况与第一种情况非常不同,因为 compare 方法将会访问到三个 Dog 实例(this、参数 #1 和参数 #2),而 compareTo 方法只能访问到两个 Dog 实例(this 和参数 #1)。


谢谢!!!但是,那句话“Comparator不会影响原始类”仍然让我感到困扰,因为即使情况2不是正确的实现方式,它仍然是一种允许的实现方式,而且它强制Dog类实现compare(),所以Dog类实际上受到了Comparator的影响,对吗? - Shyam Sreenivasan
@ShyamSreenivasan 对的,你实现的方式中,情况2显示Dog受到了Comparator的影响,但在实践中,一个类从来不会被用作它自己的Comparator,因为很容易混淆我提到的那3个实例,并且Comparator的主要用途之一是你不需要原始类的实例就能比较2个实例。 - 4castle
好的!这很酷。但我想知道为什么Java一开始就允许我们这样做。谢谢! - Shyam Sreenivasan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接