一下是一个例子:其中Employee为Manager的超类
二者都实现了接口Comparable,即 public interface Comparable
{
  int compareTo(Object otherObject);
}下面是Manager中实现的compareTo方法
public int compareTo(Object otherObject)
{
  if(otherObject instanceof Manager)
  {
    Manager other=(Manager)otherObject;
    (略)
  }
  
  else if(otherObject instanceof Employee)
  {
    return 1;
  }
  
  else
    return -((Comparable)otherObject).compareTo(this);
}Manager的compareTo方法之所以这样写是因为java语言标准中对compareTo方法有"反对称"原则的要求,
大家能说出,为什么这样写可以满足这样的原则吗?
我主要是对最后一句在这个过程中所起的作用不清楚

解决方案 »

  1.   

    反对称就是 两个对象比较时 应该满足
     
    a , b 的意义如下int  a = x.compareTo(y)  int b =  y.compareTo(x) a 和 b的符号 正负性 相反 用数学表示就是 a*b <=0 很显然 
      
    return -((Comparable)otherObject).compareTo(this);这样就可确保 再不知道otherObject 怎么定义compareTo的时候 肯定有两者符号相反
      

  2.   

    反对称的原则,是说
    如果a>b,那么b<a,如果a<b,那么b>a也就是说
    a.compareTo(b)=-b.compareTo(a)
    假设a,b都是Comparable的实例
      

  3.   

    代码有待改进
    public int compareTo(Object otherObject)
    {
      if(otherObject instanceof Manager)
      {
        Manager other=(Manager)otherObject;
        (略)
      }
      
      else if(otherObject instanceof Employee)
      {
        return 1;
      }
      
      else if(otherObject instanceof Comparable)
        return -((Comparable)otherObject).compareTo(this);
      else
        throw new java.lang.IllegalArgumentException();
    }
    如果另外一个对象定义了对此类的compareTo方法,但是此类没有处理对应的类型,如果不这么写
    就会出现
    a.compareTo(b) 和 b.compareTo(a)不反对称的情况
      

  4.   

    但是这样写存在着死循环的风险
    参考以下代码class A implements Comparable
    {
    int a; public int compareTo(Object o) {
    if(o instanceof A)
    {
    A a1=(A)o;
    if(a>a1.a)
    return 1;
    else if(a<a1.a)
    return -1;
    return 0;
    }
    else if(o instanceof Comparable)
    {
    return -((Comparable)o).compareTo(this);
    }
    else
    throw new java.lang.IllegalArgumentException();
    }
    }
    class B implements Comparable
    {
    int b; public int compareTo(Object o) {
    if(o instanceof B)
    {
    B b1=(B)o;
    if(b>b1.b)
    return 1;
    else if(b<b1.b)
    return -1;
    return 0;
    }
    else if(o instanceof Comparable)
    {
    return -((Comparable)o).compareTo(this);
    }
    else
    throw new java.lang.IllegalArgumentException();
    }
    }A a=new A();
    B b=new B();
    a.compareTo(b)将造成死循环
      

  5.   

    interpb 看着你的解释我顿时开了窍((Comparable)otherObject).compareTo(this);
    相当于otherObject对象调用compareTo时的otherObject.compareTo(aManager)用在Manager类中,将aManager换为this,再加上负号,就相当于一个"反引用"(我自己造的词),
    这样必然造成两次结果是正负相反的没想到redduke1202又提出了新问题,谢谢你这么用心:)都加分1!
      

  6.   

    还是等大家对我的理解和redduke的疑问进行确认后再结贴吧
    这样有助于讨论问题:)
      

  7.   

    接上面的代码
    测试结果
    Exception in thread "main" java.lang.StackOverflowError
    at A.compareTo(Test.java:24)
    at B.compareTo(Test.java:46)
    at A.compareTo(Test.java:24)
    at B.compareTo(Test.java:46)
    at A.compareTo(Test.java:24)
    at B.compareTo(Test.java:46)
    at A.compareTo(Test.java:24)
    at B.compareTo(Test.java:46)
    at A.compareTo(Test.java:24)
             (此处省略5000行)
      

  8.   

    这个例子是书上的,我想书上应该是在假设otherObject中已实现Comparable接口的前提下给出该代码片断的不知道这样的前提是不是就不会造成死循环的存在
      

  9.   

    楼主的例子引自core java 第6版 第201页
      

  10.   

    在反对称和存在潜在bug的风险中,比较难取舍
      

  11.   

    就是实现Comparable才存在潜在的风险
    如果不实现Comparable,则更增加 ClassCastException,类型转换异常了
      

  12.   

    那么,程序之所以这样写((Comparable)otherObject).compareTo(this);
    是因为otherObject是以Object类型传进来的,为了调用otherObject自己的compareTo,就需要把它转换为本来的类型,但又不知道它具体是什么类型,所以用Comparable类型转换就可以达到将otherObject转换为其本来类型进而调用自身compareTo方法的效果?
    这是我在另一个帖子问你的问题,你没来的及回答还.
      

  13.   

    看我上面的代码
    需要先判断一下,传入的参数是否实现了Comparable接口
    如果实现了,就用反对称的写法,如果没实现,则抛出异常