【问题标题】:In java 8, why cannot call the interface static method that the current class is implementing [duplicate]在java 8中,为什么不能调用当前类正在实现的接口静态方法[重复]
【发布时间】:2015-06-05 15:28:51
【问题描述】:

我最近在玩 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 的设计者可能会选择对以上两种情况进行不同的处理?

【问题讨论】:

  • @skaffman 相关问题与 Java 8 无关。它问:“为什么 Java 8 之前的接口中没有静态方法?”这个问题问:“在 Java 8 中,接口中允许使用静态方法,为什么我们不能从实现接口的类中调用静态方法?”没什么大不了的,虽然相关帖子可能会回答这个问题,但这个问题在技术上并不是相关帖子的重复。

标签: java java-8 interface static


【解决方案1】:

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

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

见JLS §8.4.8:

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

...

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

...

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

【讨论】:

  • 非直接超类的静态方法呢?
  • @Abhijit Sarkar:一个类从其直接超类继承所有具体方法,包括直接超类从超类的超类继承的方法等等……
  • 很遗憾他们限制了它。具有静态方法的接口可以用于创建模块/命名空间,然后组合成一个超级库,例如 scala 中的 Predef。相反,我必须使用 10 个静态导入或将它们混合使用我不喜欢的继承...
  • @piotrga 您刚刚解释了为什么这是一个非常好的设计决策,不允许这样做。
猜你喜欢
  • 2017-12-28
  • 1970-01-01
  • 2011-05-10
  • 2011-04-26
  • 2010-11-18
  • 2021-10-01
  • 2015-02-12
  • 1970-01-01
相关资源
最近更新 更多