【问题标题】:What does it mean by saying "Comparable affects the original class but Comparator doesnt"说“Comparable 会影响原始类但 Comparator 不会”是什么意思
【发布时间】:2017-07-22 03:28:25
【问题描述】:
// 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());

在案例 2 中,即使他们说 Comparator 没有修改原始类,原始类实际上也被修改了,这不是真的吗?
如果我没有正确理解这个概念,请赐教。

【问题讨论】:

  • 您的示例有缺陷(或不完整),第二个示例不需要提供Comparator 本身(事实上这确实使差异难以看出)。但请注意第三个示例独立于Dog

标签: java collections comparator comparable


【解决方案1】:

Comparable 只能在原始类上实现,因此它只能有一个实现(除非您使用子类覆盖compareTo)。同时Comparator不需要在原类上实现,所以可以有很多实现。

您的第二种情况与第一种情况完全不同,compare 将有权访问三个 Dog 实例(this、参数 #1 和参数 #2),而 compareTo 将有权访问只有两个 Dog 实例(this 和参数 #1)。

【讨论】:

  • 谢谢!!!..但是,“比较器不影响原始类”这行仍然困扰着我,因为即使案例 2 不是它的完成方式,它仍然是一个允许的实现权并且它强制 Dog 类实现 compare(),所以 Dog 类实际上受到了 Comparator 的影响,对吧?
  • @ShyamSreenivasan 是的,你实现它的方式,案例 2 显示 Dog 受到 Comparator 的影响,但实际上一个类永远不会用作它自己的 Comparator,因为它很容易让我提到的 3 个实例感到困惑,Comparator 的主要用途之一是您不需要原始类的实例即可比较 2 个实例。
  • 下车!这很酷。但只是想知道为什么 Java 甚至允许我们首先这样做。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
相关资源
最近更新 更多