首页 新闻 会员 周边

JAVA中关于实现Comparable接口问题

0
悬赏园豆:20 [待解决问题]

    问题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[]数组作为参数很好啊,为什么不行呢??????

    请各位高手指教~

inuyasha0618的主页 inuyasha0618 | 初学一级 | 园豆:132
提问于:2013-11-20 20:02
< >
分享
所有回答(3)
1

答问题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实例填进去,然后拿这个数组排序是没有问题的。

Todd Pointer | 园豆:379 (菜鸟二级) | 2013-11-20 23:57
1

问题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),这是什么?接口跟接口比较?很明显上面的更贴切,更符合面向对象规则。

_cha1R | 园豆:403 (菜鸟二级) | 2013-11-21 14:42
0

楼上两位都说的很好。

楼主对面向对象的理解还不够深。

林J | 园豆:202 (菜鸟二级) | 2013-11-25 11:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册