【问题标题】:What will happen if an interface extends many other interfaces that have the same default method?如果一个接口扩展了许多具有相同默认方法的其他接口,会发生什么?
【发布时间】:2020-07-03 15:51:42
【问题描述】:
precondition:
1.inteface A extended B,C,D;
2.A,B,C,D have same default method : default Object getById(Long Id){...};

user case:
1.class E implements A;
2.class E call default method getById, then which one will be called?

我很困惑。记不清了。^_^

【问题讨论】:

  • 你可以试试看:)
  • 你会得到一个编译错误。试试看。
  • 请不要忘记在回答您的问题时接受答案。
  • 未来的问题也请参考How to Ask a Good Question
  • 纠正覆盖或编译错误,这是预期的,谢谢大家。

标签: java java-8


【解决方案1】:

通常,您会收到关于接口中重复默认方法的错误。

不过,在这种特殊情况下,将调用子接口 A.getByID() 中的默认方法,因为子接口 A 会覆盖其超接口中的默认方法。

如果您覆盖类/接口中的默认方法,则该方法将优先于其超接口中的默认方法。

Java Language Specification 涵盖了一般情况。 (基本上,这归结为:歧义是编译错误,但类中的抽象方法优先,并消除了歧义。)

8.4.8.4。使用重写等效签名继承方法

一个类可以继承多个方法 覆盖等效签名(第 8.4.2 节)。

如果类 C 继承了具体方法,则为编译时错误 其签名与继承的另一个方法等效 由 C.

如果类 C 继承了默认方法,则会出现编译时错误 其签名与继承的另一个方法等效 由 C,除非存在在超类中声明的抽象方法 的 C 并由 C 继承,与两者重写等效 方法。

【讨论】:

    【解决方案2】:

    将调用接口 A 中存在的默认方法,因为它覆盖了其超接口的行为。

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多