日期:2014-05-20  浏览次数:20805 次

要求接口Comparable中compareTo反对称的问题
一下是一个例子:

其中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方法有 "反对称 "原则的要求,
大家能说出,为什么这样写可以满足这样的原则吗?
我主要是对最后一句在这个过程中所起的作用不清楚

------解决方案--------------------
反对称就是 两个对象比较时 应该满足

a , b 的意义如下

int a = x.compareTo(y)

int b = y.compareTo(x)

a 和 b的符号 正负性 相反 用数学表示就是 a*b <=0


很显然

return -((Comparable)otherObject).compareTo(this);

这样就可确保 再不知道otherObject 怎么定义compareTo的时候 肯定有两者符号相反
------解决方案--------------------
代码有待改进
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)不反对称的情况
------解决方案--------------------
up