2016-06-12 65 views
0

我是新來Java8,我讀了幾件事情對互聯網上的這個話題。目前我正試圖弄清楚什麼是功能接口。我找到了一些例子,但我不明白爲什麼接口跳過是一個功能的,因爲它有2個定義的方法。我希望有人能解釋我一點。該代碼是:Java的功能接口

@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) {} 
} 
+0

您可能需要閱讀[莫里斯·納夫特爾林的lambda FAQ](http://www.lambdafaq.org/what-is-a-functional-interface/)和N的作者Brian Goetz」狀態(HTTP:// cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html)中[其他幾個人(http://stackoverflow.com/tags/java-8/info) –

回答

5

Skip接口只有一個抽象方法(defaultstatic方法不計數) - 從Sprint接口繼承了sprint方法。因此它是一個功能界面。

+0

哦,我記得在一篇文章中,有人在談論默認方法不算。但是,其他人說的相反,所以我不知道該怎麼想。所以,你的意思是說,一個功能接口可以有多達一個想要的,默認和靜態方法? – Nelly

+0

@Nelly只要接口只有一個抽象方法(即沒有實現的方法),它就是一個功能接口。默認和靜態方法的數量無關緊要。 – Eran

+1

如果您有疑問,請閱讀官方文檔:https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html。它說:*從概念上講,功能接口只有一種抽象方法。由於默認方法有一個實現,它們不是抽象的。如果一個接口聲明一個抽象方法覆蓋java.lang.Object的一個公共方法,那麼它也不會計入接口的抽象方法計數,因爲接口的任何實現都會從java.lang.Object或其他地方實現。 *爲什麼人們不會閱讀文檔? –

2

去想它的最好辦法是:它將使感來表達這種接口的實例作爲單個拉姆達?當您的界面中只有一個abstract方法時,這是正確的。

Sprint的方法sprint(),它是abstract。對於此接口的λ會看起來像:

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

Skipstatic方法和default方法。方法與實例無關;這是Java中的static的含義。此外,default方法不必在子類中實現,因爲已經提供了默認實現。這意味着一個lambda只需要實現Skip(,再繼續從Sprint繼承)中的抽象方法纔有效。例如:

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

由於staticdefault方法不必由拉姆達來實現,你可以有你想要的,仍然有一個功能接口。