0

我是Java8的新手,我在 Internet 上阅读了一些关于此主题的内容。目前我正试图弄清楚什么是功能接口。我找到了一些例子,但我不明白为什么接口Skip是一个功能接口,因为它有 2 个定义的方法。我希望有人能给我解释一下。代码是:

 @FunctionalInterface
 public interface Sprint 
 {
     public void sprint(Animal animal);
 }


 @FunctionalInterface
 public interface Skip extends Sprint 
 {

      public default int getHopCount() 
      {
         return 10;
      }

      public static void skip(int speed) {}
 }
4

2 回答 2

5

你的Skip接口只有一个抽象方法(default方法static不算)——从接口sprint继承的方法。Sprint因此它是一个功能接口。

于 2016-06-12T12:53:04.570 回答
2

考虑它的最佳方式是:将此接口的实例表示为单个 lambda 是否有意义?abstract当您的界面中只有一种方法时,这是正确的。

Sprint有方法sprint(),就是abstract。这个接口的 lambda 看起来像:

Sprint sprint = animal -> {
    animal.doThingOne();
    animal.doThingTwo();
}

Skipstatic方法有default方法。static方法与实例无关;这就是staticJava中的意思。此外,default方法不必在子类中实现,因为已经提供了默认实现。这意味着 lambda 只需要在Skip(sprint()再次,继承自Sprint) 中实现抽象方法即可有效。例子:

Skip skip = Animal::doThingThree; // Equivalent to: animal -> animal.doThingThree()

由于staticdefault方法不必由 lambda 实现,因此您可以拥有任意数量的方法,并且仍然具有功能接口。

于 2016-06-12T13:01:05.400 回答