java - 具有接口(interface)的多重继承歧义

标签 java oop inheritance interface diamond-problem

我们都知道diamond problem关于多重继承 -

   A
  / \
 B   C
  \ / 
   D

这个问题描述了类 D 的模棱两可的情况。如果类 A 有一个方法,并且 B 和/或 C 两者/任何一个都覆盖了该方法,那么 D 是哪个版本的方法 覆盖?

这个问题是否也适用于 Java 中的接口(interface)?如果不是,Java 接口(interface)如何克服这个问题?

最佳答案

菱形问题仅适用于实现继承(extends在Java 8之前的所有Java版本中)。它不适用于 API 继承(implements 在 Java 8 之前的所有 Java 版本中)。

由于具有匹配类型签名的接口(interface)方法是兼容的,如果您继承相同的方法签名两次不会出现菱形问题:匹配的方法签名只是合并。 (如果类型签名不同,那么您也不存在菱形问题。)

在 Java 7 及以下版本中,继承实现代码的唯一方法是通过 extends 关键字,该关键字最多限制为一个父级。因此不存在多重实现继承,也不存在菱形问题。

Java 8 增加了一个新问题,因为它允许接口(interface)具有实现代码。当您使用具有匹配签名的方法实现多个接口(interface)时,它仍然可以通过简单地回退到以前的行为(无实现继承)来避免菱形问题。

关于java - 具有接口(interface)的多重继承歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29758213/

相关文章:

java - 将父类成员仅限于其直接子类

java - 在 java 中调用 System.gc() 是否建议对老一代和年轻一代进行垃圾收集?

java - 使用mockito创建单元测试

oop - JDK 和重写?

java - Play Framework 中的 Ebean 是否有 @NotNull 注释?

oop - 聚合、组合和依赖之间有什么区别?

java - 从 MVC 架构中的对话框获取输入

javascript对象,自引用问题

ruby-on-rails - 如何在 Rails 中设置模型继承?我有一个类和两个子类

c++ - 在 C++ 中传递参数时继承类之间的类型转换