为什么Java 8中的接口允许使用main方法?

时间:2014-10-23 06:09:17

标签: java java-8

为什么允许接口在Java 8中使用main方法?

如下面的代码所述,它可以正常工作并正确生成输出。

public interface Temp {
    public static void main(String args[]){
         System.out.println("Hello");
    }
}

目前它表现得像一个类,我用main方法执行了interface

为什么我们需要这个?

5 个答案:

答案 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的目标   启动器。)这本来是要添加额外的规则来排除的   有些人认为这很奇怪(但不危险)–   那是一场输球。您想要定义尽可能少的新规则   合理地摆脱-因为否则您会陷入困境   复杂性。