问题1:
书中是这样讲的:在JAVA中,如果想用Arrays类中的sort方法对对象数组进行排序,则对象所属的类必须实现Comparable接口。
但是我有点不明白,为什么不能在类中直接提供一个compareTo方法,而必须实现Comparable接口呢???
问题2:
《JAVA核心技术》卷一P206讲道:“有人认为,将Arrays类中的sort方法定义为接受一个Comparable[]数组就可以在使用元素类型没有实现Comparable接口的数组作为参数调用sort方法时,由编译器给出错误报告。但事实并非如此。在这种情况下,sort方法可以接收一个Object[]数组,并对其进行笨拙的类型转换:
//from the standard library--not recommended
if(((Comparable)a[i]).compareTo(a[j])>0)
{
//rearrange a[i] and a[j]
..........
}
如果a[i]不属于实现了Comparable接口的类,那么虚拟机就会抛出一个异常。”
上面的内容有点没看懂,我觉得将Arrays类中的sort方法定义为接受一个Comparable[]数组作为参数很好啊,为什么不行呢??????
请各位高手指教~
答问题1:
因为sort方法不(能)依赖你的类的实现,所以不能进行 ((OP_s_Class)item).compareTo(...)的调用,而只能用((Comparable)item).compareTo(...)的调用。因为要用OP_s_Class就需要在编译sort的代码时import OP_s_Class,这是不可能的。但import Comparable则会轻松愉快。
答问题2:
翻译真蛋疼。 “有人认为,将sort方法的参数定义为Comparable[]类型,就可以在试图使用*无素未实现Comparable接口的数组*作为参数进行调用时引发编译器错误(从而在编译时阻止这种错误调用),但事实并非。。。。"
JAVA不熟,不太清楚sort方法的具体定义,但这段的意思是想说明,如果你的数组元素没有实现Comparable接口,却试图调用sort方法,不会引发编译时错误,但会引发运行时错误。(以下为我个人意见不是这段话的内容)之所以sort允许使用非Comparable类型的数组进行调用,是因为非Comparable类型的数组可能存在着Comparable的内容。 比如基类Person类是不能比较的,但派生类Student类可以比较,这时构造一个Person类的数组,然后把Student实例填进去,然后拿这个数组排序是没有问题的。
问题1:为什么不能在类中提供方法,而必须实现Comparable接口?
这个答案很简单,实现接口必须实现comparaTo()方法。
因为Arrays.sort(Object[] objs)方法它内部必须把Object数组里面强制转换为Comparable类型,才可以调用comparaTo()方法。而你仅仅在类中写ComparaTo()方法,那它怎么调?你传进去的是Object而不是其他,Object没这个方法。
问题2:为什么不用Comparable数组作为参数。
首先这个我只是我个人猜测。
为什么不传入Comparable而传入Object?
首先我们知道Comparable接口是有一个泛型的,而且comparaTo(T o) 接收的也是泛型
public interface Comparable<T> { public int compareTo(T o); }
但是泛型是JDK1.5才出来的特性,那么在Comparable接口之前是什么样子的呢?这这样的
public interface Comparable { public int compareTo(Object o); }
这里传入的参数是基类Object。而他为什么不直接传入Comparable c作为参数呢?这我想是一个面向对象的问题。
compareTo 是 “相对于”的意思。 object.comparaTo(object) 则对象相对于对象,对象与对象的相对比较。
那如果传入的是Comparable接口,则是comparable.compareTo(comparable),这是什么?接口跟接口比较?很明显上面的更贴切,更符合面向对象规则。
楼上两位都说的很好。
楼主对面向对象的理解还不够深。