2016-06-12 7 views
0

私はJava8に新しく、インターネット上でこのトピックに関するいくつかのことを読んでいます。現時点では、私は機能的なインターフェースが何であるか把握しようとしています。私はいくつかの例を見つけましたが、なぜインタフェースがSkipが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

[Maurice NaftalinのLambda FAQ](http://www.lambdafaq.org/what-is-functional-interface/)と[Brian Goetz 'Lambdaの状態](http:// cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html)[他のいくつかの]の中で(http://stackoverflow.com/tags/java-8/info) –

答えて

5

あなたSkipインタフェースは、唯一の抽象メソッド(defaultstatic方法はカウントされません)がある - Sprintインタフェースから継承sprint方法を。したがって、それは機能的なインターフェイスです。

+0

ああ、私は覚えている1つの記事では、誰かがデフォルトの方法について数えていないと話していました。しかし、他の誰かが反対に言ったので、私はもう何を考えなければならないのか分からなかった。だから、機能的なインターフェースは、1つのもの、デフォルトと静的メソッドを持つことができるということを意味するのだろうか? – Nelly

+0

@Nellyインターフェイスに抽象メソッドが1つしかない場合(つまり、実装されていないメソッド)、機能的なインターフェイスです。デフォルトメソッドと静的メソッドの数は関係ありません。 – Eran

+1

疑問がある場合は、公式のドキュメント(https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html)を参照してください。それは言う:*概念的には、機能的なインターフェイスはまさに1つの抽象メソッドを持っています。デフォルトのメソッドには実装があるため、抽象メソッドではありません。インタフェースがjava.lang.Objectのパブリックメソッドの1つをオーバーライドする抽象メソッドを宣言している場合、インタフェースの実装にはjava.lang.Objectまたは他の場所からの実装があるため、インタフェースの抽象メソッドカウントにはカウントされません。 *なぜ人々は文書を読んでいないのですか? –

2

これについて考える最も良い方法は次のとおりです。このインターフェイスのインスタンスを単一のラムダとして表現するのは理にかなっていますか?これは、インターフェイスに正確に1つのabstractメソッドがある場合に当てはまります。

Sprintは、方法sprint()であり、abstractである。このインタフェースのためのラムダは、次のようになります。

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

Skipstatic方法とdefault方法があります。 staticメソッドはインスタンスとは関係ありません。これはJavaでのstaticの意味です。さらに、defaultメソッドは、デフォルトの実装が既に提供されているため、サブクラスで実装する必要はありません。つまり、ラムダはSkipsprint()、再びSprintから継承)の抽象メソッドを実装するだけで有効です。例:staticdefault方法はラムダで実装する必要がないので

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

、あなたが好きなだけを持って、まだ機能的なインターフェースを持つことができます。

関連する問題