如何解决方法声明的冲突?
因为可以从多个接口继承,相同的缺省方法可以通过不同的路径继承。由于每个继承的默认方法提供了不同的实现,编译器需要一种方式从中做出选择。下面是它的工作模式:
(1)类总是优先。类或父类的声明优先级高于任何缺省的方法声明。
(2)否则,选择具有相同签名的最具体的默认提供接口的该方法。例如,根据以上规则下面的代码输出Hello World from B。
public interface A {
default void hello() { System.out.println("Hello World from A"); }
}
public interface B extends A {
default void hello() { System.out.println("Hello World from B"); }
}
public class C implements B, A {
public static void main(String... args) {
new C().hello();
}
}
冲突并不总是可以避免的。如果在上面的例子中,接口B没有继承A,那么C将从无关接口继承与签名匹配的缺省的方法。编译的代码将产生错误信息:
class C inherits unrelated defaults for hello() from types A and B//类C从A和B中继承了不相关的缺省方法hello
reference to hello is ambiguous, both method hello() in A and method hello() in B match.//从A和B到hello的引用是二义性的,A中的hello和B中的hello都匹配。
注意,第一个错误将报告是否有一个调用到继承的默认方法。冲突必须通过重写来解决。如果需要的话,对继承方法之一可以使用新的语法X.super.m(...),其中X是超接口,m是其选择的方法:
public class C implements B, A {
public void hello() {
A.super.hello();
}
...
}
现在打印“Hello World from A”。注意这个语法只能用于解决冲突,不覆盖上面列出的两个主要规则。
原文链接:http://www.lambdafaq.org/how-are-conflicting-method-declarations-resolved/
分享到:
相关推荐
#### 3. 如何判断电源或缓冲区出错,如:电池故障? - **判断方法**: - 观察CPU面板上的指示灯状态。 - 在SIMATIC Manager软件中检查诊断缓冲区的信息。 - 定期维护,更换电池以预防故障。 #### 4. 为S7CPU上...
- 解决局部变量和成员变量名称冲突。 **3.8 初始化问题** - 初始化顺序:实例变量、构造方法、子类构造方法。 - 使用构造方法进行对象初始化。 **3.9 static关键字** - 定义类变量和静态方法。 - 静态方法可以...
在Java编程语言中,包(package)是一种组织类的方式,它的引入主要是为了管理和解决大型项目中大量类的命名冲突问题。包在Java中扮演着类似文件系统目录的角色,允许我们按照一定的逻辑结构对类进行分类和分层。 1...
- **头文件结构**:规范头文件的组织形式,包括宏定义、类型定义等,避免命名冲突。 - **定义文件结构**:定义文件的组成部分,如预处理指令、数据结构定义等,确保清晰易读。 - **头文件作用**:解释头文件的主要...
- RuntimeException及其子类,不需要在方法声明中明确抛出。 ##### 8.9 写你自己的异常 - 通过继承Exception或其子类来创建自定义异常。 ##### 8.10 抛出你自己的异常 - 使用throw语句抛出自定义异常。 #### 第九...
- 解决多重继承中名称冲突的主要手段是使用作用域解析操作符`::`来明确指出使用哪个基类的成员,或是在类中使用别名。 9. **基类的哪些成员是不可以被子类继承的?** - 基类中的`private`成员不会被派生类继承。 ...
+在aspx页面中必须显示的声明控件的集合属性(比如Tabs(TabStrip), Items(PanelBase), Nodes(TreeNode))。 -这将会影响所有的aspx页面,所以要特别关注。 -重命名AccordionPanel为AccordionPane (这也是在Asp...
【XML名称空间】是XML技术中的关键特性,用于解决元素和属性名称的冲突问题,确保在文档中具有相同名称的元素能被正确地区分。这一章深入探讨了XML名称空间的概念、声明方式以及其在XML文档中的应用。 XML文档可能...
- **作用**:解决元素名称冲突问题。 - **声明**: - 直接定义:`xmlns:前缀="URI"`。 - 缺省定义:`xmlns="URI"`。 - **使用**: - 限定元素名称。 - 限定属性名称。 #### 10. XML Schema - **定义**:一种...
#### 3. 如何评价C++? C++是一种非常强大且灵活的语言,它支持多种编程范式(如过程式编程、面向对象编程和泛型编程)。C++的设计使其能够高效地处理复杂的数据结构和算法。然而,这种灵活性也带来了更高的学习...
- **参数的缺省值**:讲解了如何给函数参数设定缺省值。 - **运算符重载**:探讨了运算符重载的意义及其实现细节。 - **函数内联**:解释了内联函数的工作原理及其应用场景。 - **一些心得体会**:分享了作者在函数...
- **运算符优先级**:强调了解决优先级冲突的重要性。 - **复合表达式**:讲解了如何正确构建复杂的表达式。 - **IF语句**:介绍了条件语句的最佳实践。 - **循环语句效率**:探讨了不同循环结构的性能差异。 - **...
解决基类成员名冲突的一种方法是通过基类分解,即创建一个新的基类作为中介,将原来冲突的基类作为新基类的成员,从而消除冲突。 11. **多继承技术**: - **虚拟继承(virtual inheritance)**:在多继承中使用`...
9. **解决基类成员名冲突**: - 使用作用域解析运算符`::`明确指定要访问的基类成员,例如`基类1::成员`。 10. **基类分解**: - 为了避免或解决多继承中的问题,有时需要重新组织基类结构,避免继承冲突。 11....
- **解决方法**:使用智能指针、RAII资源管理等技术。 **7.3 指针与数组的对比** - **区别**:指针可以重新指向不同的地址;数组名是一个不可变的指针。 **7.4 指针参数是如何传递内存的?** - **机制**:通过指针...
#### 第3章 程序流程控制——语句 **3.1 概述** - 控制语句用于控制程序的执行流程。 **3.2 表达式语句** - 包含一个表达式的语句,如赋值语句。 **3.3 选择语句** - **条件语句if**:根据条件选择一条或多条...
-增加示例(iframe/parent_postback_run3.aspx),如何通过简单的Javascript代码回发父页面(feedback:eroach)。 -修正一些书写错误(feedback:bmck)。 -从Region控件中删除SplitColor属性,增加CollapseMode, ...