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)
您无法通过实例访问接口的静态方法.你必须静态访问它们.这与允许通过实例访问静态方法的类略有不同,但通常标记为代码气味; 静态方法应该静态访问.
这是因为类的静态方法是由子类继承的,但接口的静态方法却不是.这在规范的§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)
| 归档时间: |
|
| 查看次数: |
775 次 |
| 最近记录: |