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

时间:2015-04-01 04:51:39

标签: interface static java-8

我最近在玩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的设计师会选择以不同的方式处理上述两种情况吗?

1 个答案:

答案 0 :(得分:33)

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

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

请参阅JLS §8.4.8

  

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

     

...

     

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

     

...

     

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