在java 8中,为什么不能调用当前类正在实现的接口静态方法

2022-09-01 13:07:45

我最近正在研究Java 8的新功能,并观察到一个有趣的行为:

这没关系:

Class A { static void staticMethodInA() {println();} }
Class B extends A {}

B.staticMethodInA();

这将导致错误:静态方法只能在包含接口类时调用

interface A { static void staticMethodInA() {println();} }
Class B implements A {}

B.staticMethodInA(); // from here IntelliJ complaints..

有人能告诉我为什么Java 8的设计者会选择以不同的方式对待上述2种情况吗?


答案 1

在Java 8的接口中添加方法有1个限制 - 这些方法不能被实现它的类继承。这是有道理的,因为一个类可以实现多个接口。如果 2 个接口具有相同的方法,则它们都将被继承,编译器将不知道要调用哪一个。staticstatic

但是,对于扩展类,这没有问题。 类方法由子类继承。static

参见 JLS §8.4.8

类 C 从其直接超类继承超类的所有具体方法 m(静态和实例)

...

类 C 继承自其直接超类和直接超接口的所有抽象和默认 (§9.4) 方法 m

...

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


答案 2

推荐