为什么允许接口在Java 8中使用main
方法?
如下面的代码所述,它可以正常工作并正确生成输出。
public interface Temp {
public static void main(String args[]){
System.out.println("Hello");
}
}
目前它表现得像一个类,我用main方法执行了interface
。
为什么我们需要这个?
答案 0 :(得分:35)
从Java 8开始,接口中允许使用静态方法。
main()是一种静态方法。
因此,接口允许使用main()。
我们并非需要这一点,因为以前不允许这样做,但我们幸免于难。但是,根据定义,静态方法不是绑定到类的实例,而是绑定到类本身,因此在接口中允许它们是有意义的。它允许在接口本身中定义与接口相关的实用程序方法(例如,在Collections
中找到的),而不是单独的类。)
类静态方法和接口静态方法之间没有区别。
答案 1 :(得分:12)
我是@ jb-nizet的答案。对此没有“绝望的需求”,但它消除了不必要的限制。例如。一个例子是,您现在可以在界面中声明一个工厂方法:
public interface SomeService {
public static SomeService getInstance() {
// e.g. resolve via service provider interface
}
...
}
在Java 8之前,我们总是需要一个单独的工厂类。一个最喜欢的例子是谷歌应用引擎API。
答案 2 :(得分:6)
在Java 8中,接口可以具有静态方法。由于main方法也是静态方法,因此它将允许它。
我们可以使用这些静态方法声明常见的辅助方法。
答案 3 :(得分:0)
更多附录:也许这里的一个想法是类似于您可以使用Scala中的Application trait 进行的操作:
object Main extends Application {
Console.println("Hello World!")
}
只需扩展 Application
,即可将一个类转换为可运行的类。
答案 4 :(得分:0)
来自Brian Goetz的评论:
我认为您有倒退的问题。问题不是“应该 主要方法被允许”,这是“我们是否应明确禁止 现在主要的方法是接口中允许使用静态方法” (或等效地,将接口类排除为java的目标 启动器。)这本来是要添加额外的规则来排除的 有些人认为这很奇怪(但不危险)– 那是一场输球。您想要定义尽可能少的新规则 合理地摆脱-因为否则您会陷入困境 复杂性。