JAVA,无法绕过更具体的直接超级类型

Tom*_*zyk 3 java default interface

我正在学习接口。这里会发生什么?以及为什么我收到一条消息:

“对超级类型SomeInterface2的非法引用,不能绕过更具体的直接超级类型interfejsy.SomeInterface3”

public interface SomeInterface1 {       
    public default void action(){
        System.out.println("default interface1 method");
    };

}

public interface SomeInterface2 {
    public default void action(){
        System.out.println("default interface2 method");
    };
}

public interface SomeInterface3 extends SomeInterface2{

    public default void action(){
        System.out.println("default interface3 method");
    }
}
Run Code Online (Sandbox Code Playgroud)

...

public class ClassImplementingInterface implements SomeInterface1, SomeInterface2, SomeInterface3{

    //Every interface has action() method so we have to override it
    @Override
    public void action() {
        SomeInterface1.super.action();
        SomeInterface2.super.action(); //---- compiler error
        SomeInterface3.super.action();
    }
}
Run Code Online (Sandbox Code Playgroud)

che*_*oon 5

您不能访问SomeInterface2的默认方法,因为它是SomeInterface3的超级接口。作为实现类,ClassImplementingInterface只能访问其直接超级接口的默认方法。从逻辑的角度来看,ClassImplementingInterface既实现了SomeInterface2又实现了SomeInterface3,但是SomeInterface2是超级接口,似乎不合理,如果必须这样做,请尝试以下程序。

public interface SomeInterface1 {       
    public default void action(){
        System.out.println("default interface1 method");
    };
}

public interface SomeInterface2 {
    public default void action(){
        System.out.println("default interface2 method");
    };
}

public interface SomeInterface3 extends SomeInterface2{
     public default void action(){
         System.out.println("default interface3 method");
     }
     public default void action2(){
         SomeInterface2.super.action();
     }
  }

public class ClassImplementingInterface implements SomeInterface1,SomeInterface2,SomeInterface3{
    public void action() {
        SomeInterface1.super.action();
        SomeInterface3.super.action2();
        SomeInterface3.super.action();
    }
Run Code Online (Sandbox Code Playgroud)

}