Java interface中方法和Object方法冲突

bloglogo.png

在看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中报错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,687评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,263评论 0 2
  • 我在二纬路停车一会想去卫津路买一套煎饼果子一位瘸子先生贴着车窗伛偻前行我想起了那年在天涯海角三亚的沙石划破了我的大...
    小者阅读 227评论 2 1