为什么我不能使用实例变量访问接口的静态方法

cha*_*ina 4 java language-lawyer

为什么我不能使用实例变量访问接口的静态方法.

public class TestClass {
    public static void main(String[] args) {
        AWD a = new Car();
        a.isRearWheelDrive(); //doesn't compile
    }
}

interface AWD {
    static boolean isRearWheelDrive() {
        return false;
    }  
}

class Car implements AWD {
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 7

静态接口方法不由子类继承

您无法通过实例访问接口的静态方法.你必须静态访问它们.这与允许通过实例访问静态方法的类略有不同,但通常标记为代码气味; 静态方法应该静态访问.

这是因为类的静态方法是由子类继承的,但接口的静态方法却不是.这在规范的§8.4.8中说明:

8.4.8.继承,压倒和隐藏

...

类不会从其超接口继承静态方法.

当您查找实例的可访问方法时,接口中的静态方法不在其中.

代码选项

因此,现在代码是,您需要静态访问该方法:

AWD.isRearWheelDrive()
Run Code Online (Sandbox Code Playgroud)

但是,您似乎希望这是一个实例方法,在这种情况下,您可能应该使用返回false的默认方法:

interface AWD {
  default boolean isRearWheelDrive() {
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

不过,即使这看起来有点奇怪.看起来您可能希望该默认方法覆盖超级接口中的某些非默认方法.也就是说,您可能需要以下内容:

  interface HasDriveWheels {
    boolean isRearWheelDrive();
  }

  interface AllWheelDrive extends HasDriveWheels {
    @Override
    default boolean isRearWheelDrive() {
      return false;
    }
  }
Run Code Online (Sandbox Code Playgroud)