在看java.util.Collection的时候,发现Collection有两个方法标注的是继承自Object:
当时就纳闷了;虽然知道Java中所有的类都隐式地继承自Object,但是Collection是个interface啊。出于好奇的我就写了下面的测试代码:
public interface MyInterface {
void toString();//toString() in cn.jerry.jerrydemo.MyInterface clashes with toString() in java.lang.Object;Attempting to use incompatible return type
}
toString()后面的注释就是IDE在编译时给出的error,意思就是我这个Interface中的toString方法和Object中的toString方法冲突了,原因是返回值类型不同。
Why
我们知道,如果一个子类继承了父类的一个方法,如果这两个方法的签名(一个方法的签名包括:方法名和参数)一致,那么我们就知道:子类override了父类的方法;(如果签名不一致,要么这两个方法没鸟关系,要么是重载);在override时,如果该方法的返回值类型不一致,或者子类该方法的访问权限修饰符低于父类该方法的访问权限修饰符,那么就会clash。
接着我们的主题:
为什么接口中和Object某个方法的签名一致而返回值类型不一致也会clash呢?
我们又知道,interface是一个特殊的数据类型,它超出三界之外,不受Object控制,也就是说它没有继承自Object,override Object的function也就无从谈起。那么clash从何而来呢?
要解答这个问题,我们就需要知道以下内容:
一个Interface在Java中是不可以直接使用的。也就是说不可以直接new。如果要使用,必须使用它的实现类(implementation)。比如说你一个A类实现了我上面的那个MyInterface接口,那么它就必须要实现void toString()方法,这个toString()方法和Object中的toString()方法的签名是一致的;但是----返回值不同。我擦,这个时候就clash了。
结论
接口虽然和Object没啥鸟关系,但是它的实现类肯定是间接或直接继承自Object,你interface中有方法和Object中的某个方法签名一致而返回值不同(不会因为访问权限不同而冲突,因为interface中所有方法都是public的),那么它的子类就会产生clash。冲突产生自implementation,但是要从根源上杜绝clash,因此在interface中报错。