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

Sex*_*erd 21 static interface java-8

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

这没关系:

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

B.staticMethodInA();
Run Code Online (Sandbox Code Playgroud)

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

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

B.staticMethodInA(); // from here IntelliJ complaints..
Run Code Online (Sandbox Code Playgroud)

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

Roh*_*ain 34

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

但是,通过扩展课程,这没有问题.static类方法由子类继承.

JLS§8.4.8:

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

...

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

...

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

  • @piotrga你刚刚解释了为什么这是一个非常好的设计决策,而不是允许这样做。 (2认同)