【发布时间】:2014-10-23 06:09:17
【问题描述】:
为什么在 Java 8 中允许接口具有 main 方法?
如下面的代码所述,它可以正常工作并正确生成输出。
public interface Temp {
public static void main(String args[]){
System.out.println("Hello");
}
}
目前它表现得像一个类,我已经用 main 方法执行了interface。
我们为什么需要这个?
【问题讨论】:
-
我认为你的问题倒过来了。问题不是“应该允许主要方法”,而是“现在我们是否应该明确禁止主要方法,因为接口中允许使用静态方法”(或者,等效地,排除接口类作为 java 启动器的目标。)这将有添加额外规则只是为了排除一些人认为奇怪(但不危险)的东西——这是一场失败的游戏。您希望定义尽可能少的新规则,因为否则您会陷入复杂性的泥潭。
-
@BrianGoetz 是的,同意!!我正在寻找与输出相同的东西,我担心的是,为什么我们有一个实际上表现得像一个类的接口,而 Java 能够执行 interface 的主要方法.最后接口实际上是一个类,java无法区分接口的main和类。
-
接口是类类型,而且一直都是。它们有一些不同的默认值(方法是公共的和抽象的),以及一些不同的限制。在 Java 8 中,我们删除了一些限制——例如对静态方法的限制。我们不会仅仅因为一开始对一些人来说很奇怪,就制定一个特殊的规则来禁止一种特定的静态方法。当你真正了解新规则时,这看起来并不奇怪——实际上你提出的限制看起来会很奇怪。
-
@BrianGoetz 但内部接口方法应该是抽象的。如果是静态方法,这条规则是否也会在 Java8 中被删除?