一下是一个例子:其中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方法有"反对称"原则的要求,
大家能说出,为什么这样写可以满足这样的原则吗?
我主要是对最后一句在这个过程中所起的作用不清楚
二者都实现了接口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的时候 肯定有两者符号相反
如果a>b,那么b<a,如果a<b,那么b>a也就是说
a.compareTo(b)=-b.compareTo(a)
假设a,b都是Comparable的实例
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)不反对称的情况
参考以下代码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)将造成死循环
相当于otherObject对象调用compareTo时的otherObject.compareTo(aManager)用在Manager类中,将aManager换为this,再加上负号,就相当于一个"反引用"(我自己造的词),
这样必然造成两次结果是正负相反的没想到redduke1202又提出了新问题,谢谢你这么用心:)都加分1!
这样有助于讨论问题:)
测试结果
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行)
如果不实现Comparable,则更增加 ClassCastException,类型转换异常了
是因为otherObject是以Object类型传进来的,为了调用otherObject自己的compareTo,就需要把它转换为本来的类型,但又不知道它具体是什么类型,所以用Comparable类型转换就可以达到将otherObject转换为其本来类型进而调用自身compareTo方法的效果?
这是我在另一个帖子问你的问题,你没来的及回答还.
需要先判断一下,传入的参数是否实现了Comparable接口
如果实现了,就用反对称的写法,如果没实现,则抛出异常