要求接口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