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

In java 8, why cannot call the interface static method that the current class is implementing

本问题已经有最佳答案,请猛点这里访问。

我最近在玩Java 8的新特性,观察到一个有趣的行为:

这没关系:

1
2
3
4
Class A { static void staticMethodInA() {println();} }
Class B extends A {}

B.staticMethodInA();

这将导致以下错误:只能对包含接口类调用静态方法。

1
2
3
4
interface A { static void staticMethodInA() {println();} }
Class B implements A {}

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

有人能告诉我为什么JavaJavaDesigner 5月8日选择对上述2种情况进行不同的处理吗?


在Java 8中接口中添加EDCOX1 0个方法产生了1个限制——这些方法不能被实现它的类继承。这是有意义的,因为类可以实现多个接口。如果两个接口有相同的static方法,它们都将被继承,编译器不知道要调用哪一个。

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

见JLS§;8.4.8:

A class C inherits from its direct superclass all concrete methods m (both static and instance) of the superclass

...

A class C inherits from its direct superclass and direct superinterfaces all abstract and default (§9.4) methods m

...

A class does not inherit static methods from its superinterfaces.