Java interface中方法和Object方法冲突
来源:互联网 发布:znds网络电视论坛官网 编辑:程序博客网 时间:2024/06/11 12:33
在看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中报错。
- Java interface中方法和Object方法冲突
- java中Interface和Object关系?
- Java中 Object的方法
- Java中Object的方法
- Java中Object的方法
- JAVA中object的方法
- Java中Object的方法
- Java中Object类方法
- java中object常用方法
- Java中Object类的equals()和hashCode()方法
- java Object对象中hashCode和equals方法学习
- Interface中定义方法
- Java中Object类的方法(toString方法和equals方法)
- java中interface中的方法为什么不能是static方法?
- Java Object类中方法理解
- Java Object类中方法理解
- JAVA中Object对象拥有的方法
- java Object类中常用的方法
- [JSOI2008]最大数(栈+二分||动态加点的线段树)
- MyBatis解决Java实体类和表字段不一致方法
- strcmp函数的实现
- 作业二十六 Arbitrage
- 困难的串uva129(dfs)
- Java interface中方法和Object方法冲突
- 如何将多个excel文件合并成一个
- 友盟多渠道打包
- 爱上MVC~业务层刻意抛出异常,全局异常的捕获它并按格式返回
- JS的的作用域和闭包
- 第四十六篇:MAC下使用 Node.js 实现一个 WebServer 服务器
- SSL P1520 牛的rp
- MATLAB实现PLA算法
- jQuery选择器(:nth-child(n))详解