在Java核心技术上我看到一个问题:
为什么要实现Comparable接口而不直接在类中提供一个compareTo方法?
主要原因在于Java程序设计语言是一种强类型(strongly typed)语言。在调用方法的时候,编译器要能检查这个方法确实存在。在sort方法中可能会有下面这样的语句:
if (a[i].compareTo(a[j])>0)
{
//rearrange a[i] and a[j]
. . .
}
编译器必须确认a[i]一定有一个 compareTo方法。如果a是一个Comparable对象的数组,就可以确保拥有compareTo方法,因为每个实现Comparable接口的类都必须提供这个方法的定义。
强类型语言不是指一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。可我看书感觉和它是强类型语言没什么关系,反而这和编程规范有关,有没有大佬通俗解释一下
二者没有关系……
在这个场景下强类型其实指的是编译时就能确定一个对象拥有哪些成员,而弱类型语言往往在运行时才能确定。
你这个例子里强类型那句只是顺嘴提了一句。而且你漏了最重要的一段话,是描述关于
Arrays.sort
这个方法的。因为
Array.sort
不能依赖倒置,它首个参数是Object[]
(估计你还没看到泛型,先忽略它)。因为不确定传进来是啥,所以先用Object[]
接收了。可Object
类型没有compareTo
方法呀,a[i].compareTo(a[j])
不就编译报错了?(这就是所谓强类型)那么我就需要有一个类型,那一定有
compareTo
方法才行。比如你自定义了一个类型FooClass
,它有compareTo
方法,你((FooClass)a[i]).compareTo(a[j])
这这么写编译是不会报错的。但 JDK 写Array.sort
这个方法时,它怎么能知道以后有个类FooClass
呢?它的强转代码也没法依赖你这个FooClass
呀?那么怎么办?那需要提前存在某种类型、这个类型有一个
compareTo
方法、好让Object
能强转成它,并且不影响开发者以后自定义类型。那么在 Java 中有抽象类和接口这两种选择。那么为什么用接口而没用抽象类呢?因为 Java 中不能多继承。如果是抽象类,那么你要排序首先就必须继承它,而就无法再继承别的类了。但接口不存在这个问题,你可以同时实现多个接口。