java1.8 接口默认方法的多继承

冷不防 2023-10-05 11:29 48阅读 0赞

Java 使用的是单继承、多实现的机制,为的是避免多继承带来的调用歧义的问题。当接口的子类同时拥有具有相同签名的方法时,就需要考虑一种解决冲突的方案。

  1. interface InterfaceA {
  2. default void foo() {
  3. System.out.println("InterfaceA foo");
  4. }
  5. }
  6. interface InterfaceB {
  7. default void bar() {
  8. System.out.println("InterfaceB bar");
  9. }
  10. }
  11. interface InterfaceC {
  12. default void foo() {
  13. System.out.println("InterfaceC foo");
  14. }
  15. default void bar() {
  16. System.out.println("InterfaceC bar");
  17. }
  18. }
  19. class ClassA implements InterfaceA, InterfaceB {
  20. }
  21. // 错误
  22. //class ClassB implements InterfaceB, InterfaceC {
  23. //}
  24. class ClassB implements InterfaceB, InterfaceC {
  25. @Override
  26. public void bar() {
  27. InterfaceB.super.bar(); // 调用 InterfaceB 的 bar 方法
  28. InterfaceC.super.bar(); // 调用 InterfaceC 的 bar 方法
  29. System.out.println("ClassB bar"); // 做其他的事
  30. }
  31. }

在 ClassA 类中,它实现的 InterfaceA 接口和 InterfaceB 接口中的方法不存在歧义,可以直接多实现。

在 ClassB 类中,它实现的 InterfaceB 接口和 InterfaceC 接口中都存在相同签名的 foo 方法,需要手动解决冲突。覆写存在歧义的方法,并可以使用 InterfaceName.super.methodName(); 的方式手动调用需要的接口默认方法。

节取自https://ebnbin.com/2015/12/20/java-8-default-methods/

发表评论

表情:
评论列表 (有 0 条评论,48人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java8接口默认方法

    解决问题:在java8 之前的版本,在修改已有的接口的时候,需要修改实现该接口的实现类。 作用:解决接口的修改与现有的实现不兼容的问题。在不影响原有实现类的结构下修改新的功能