为什么接口中没有静态方法,但静态字段和内部类OK?[Java8之前]

2022-08-31 11:09:02

这里有一些问题是关于为什么不能在接口中定义静态方法,但没有一个解决基本的不一致:为什么可以在接口中定义静态字段和静态内部类型,而不是静态方法?

静态内部类型可能不是一个公平的比较,因为这只是生成新类的语法糖,但为什么是字段而不是方法呢?

反对接口内静态方法的一个论点是,它破坏了JVM使用的虚拟表解析策略,但这难道不应该同样适用于静态字段,即编译器可以内联它吗?

一致性是我想要的,Java应该要么不支持接口中任何形式的静态,要么应该是一致的并允许它们。


答案 1

已经提出了一个官方建议,允许在Java 7的接口中使用静态方法。该提案是在Project Coin下提出的。

我个人的观点是,这是一个好主意。在实现中没有技术困难,这是一件非常合乎逻辑、合理的事情。Project Coin中有几个提案,我希望它们永远不会成为Java语言的一部分,但这是一个可以清理很多API的提案。例如,Collections 类具有用于操作任何实现的静态方法;这些可以包含在界面中。ListList


更新:Java Posse Podcast #234中,Joe D'arcy简要提到了这个提议,称它很“复杂”,可能不会出现在Project Coin下。


更新:虽然他们没有进入Java 7的Project Coin,但Java 8确实支持接口中的静态函数。


答案 2

我将用我的宠物理论来讨论这个问题,即在这种情况下缺乏一致性是一个方便的问题,而不是设计或必要性的问题,因为我没有听到令人信服的论点,证明它是这两者中的任何一个。

静态字段之所以存在(a)是因为它们存在于JDK 1.0中,并且在JDK 1.0中做出了许多狡猾的决定,并且(b)接口中的静态最终字段是当时Java最接近常量的东西。

允许接口中的静态内部类,因为这是纯粹的语法糖 - 内部类实际上与父类没有任何关系。

因此,不允许使用静态方法,因为没有令人信服的理由这样做;一致性不足以改变现状。

当然,这可以在未来的JLS版本中被允许,而不会破坏任何东西。