java 解决默认方法冲突
来源:互联网 发布:java开发界面 编辑:程序博客网 时间:2024/06/06 03:15
解决接口冲突的规则:
1)超类优先:如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法将被忽略
2)如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(无论是不是默认参数)相同的方法,必须覆盖这个方法来解决冲突。
下面来看看第二个规则。考虑也包含一个getName方法的接口
interface Named{ default String getName() { return getClass().getName()+"-"+hashCode(); }}
如果有一个类同时实现了这两个接口会怎么样呢
class Student implements Person,Named{}
类会继承Person和Named接口提供的两个不一致的getName方法,并不是从中选择一个,Java编译器会报告一个错误,让程序员来解决这个二义性。只需要在Student类中提供一个getName方法。在这个方法中,可以选择两个冲突方法中的一个,如下所示:
class Student implements Person,Named{ public String getNamed() { return Person.super.getNamed(); }}
现在假设Named接口没有为getName提供默认实现
interface Named{ String getName();}
student类会从Person接口继承默认方法吗?这好像挺有道理,但是,java设计者更强调一致性。两个接口如何冲突不重要。如果至少有一个借口提供了一个实现,编译器就会报告错误,而程序员就不需解决这个二义性。
如果两个接口都没有为共享方法提供默认实现,那么就与java SE8之前的情况是一样。这里不存在冲突。实现类可以有两个选择:实现这个方法,或者干脆不实现。如果时候一种情况,这个类本身就是抽象的。
我们只讨论了两个接口的命名冲突。现在来考虑另一种情况。一个类扩展了一个超类,同时实现了一个接口,并从超类和接口中继承了相同的方法。例如:假设Person是一个类,Student定义为:
class Student extends Person implements Named{}
在这种情况下,只会考虑超类方法,接口的所有默认方法都会被忽略。在我们的例子中,Student从Person继承了getName方法,Named接口是否为getName提供了默认实现并不会带来什么区别。这正是类优先规则。
类优先规则可以确保与java SE 7的兼容性。如果为一个接口增加默认方法,这对于有这个默认方法之前能正常工作的代码不会有任何影响。
千万不要让一个默认方法重新定义Object类中的任何方法。例如:不能为toString或者equals定义默认方法,尽管对于List之类的接口这可能很有吸引力。由于“类优先”规则,这样的方法绝对无法超越Object.toString或者Object.equals.
- java 解决默认方法冲突
- 接口默认方法冲突
- Intellij Idea 的 vim 插件和默认快捷键冲突解决的方法
- LNK4098,默认库冲突的解决
- Java Jar冲突解决
- 更换git默认冲突编辑器的方法
- 解决tortoiseSVN冲突的方法
- SVN解决冲突的方法
- smartsvn解决冲突的方法
- 解决hash冲突的方法
- 解决hash冲突的方法
- ScrollView冲突自定义方法解决
- TortosieGit解决冲突的方法
- 解决hash冲突的方法
- java解决hash算法冲突
- java 多线程 解决资源冲突
- 解决java文件编码和windows7系统(中文版)默认编码冲突所导致的乱码情况
- JAVA默认方法
- scala变量访问范围
- 从0开始架构一个IOS程序——03 — -分包用添加pch全局引用文件
- NIO初探
- 设置内核线程的调度策略
- 修改mysql数据库字符集为UTF8的
- java 解决默认方法冲突
- Maven常用参数及其说明
- effective C++解读
- CodeForces
- bugku 考细心
- ios使用AVCaptureVideoDataOutput实现连续拍照消除快门声音
- SVN 常见问题
- HTML第一次总结
- 在linux下使用socket通信,accept调用产生accept error:Invalid argument