2016-07-03 7 views
2

私はJavaのインタフェースInterfaceAがあり、3つのメソッドが異なるシグネチャ(そのうち2つはデフォルト)を定義しています。ラムダ関数をパラメータとして、インタフェースを期待するメソッドに渡す

f((ArgA) -> return ArgA.write()) 

どのようInterfaceA 3つのメソッドを定義することを知って、このことが可能である:これは、これが使用される方法である

public void f(InterfaceA ia) { 
    ..... 
} 

とユニットテストで:

別のクラスは、メソッドそうような定義しますか?

+0

ラムダ式について読んでください。 – Eran

+0

しました。私はまだここで何が起こっているのか分かりません。私はラムダがインターフェイスメソッドを超えていると推測することができますが、どのように?どれ?代わりに匿名のクラスを定義するのはなぜですか? – Kam

+1

ラムダ式は、あなたの関数型インタフェース 'InterfaceA'の単一メソッドの実装を提供しています。これは、匿名クラスのインスタンスと非常によく似た動作をします。 – Eran

答えて

2

@FunctionalInterfaceのドキュメントによれば、インターフェイスがnのメソッドを実装しているということは、有効なインターフェイスとしては機能しないということを意味するわけではありません。これらの方法の詳細は重要です。

概念的には、機能的なインターフェイスには、厳密に1つの抽象メソッドがあります。 デフォルトメソッドには実装があるため、抽象メソッドではありません。 publicメソッドの1つをオーバーライドする抽象メソッドを宣言する場合、 インターフェイスの実装にはjava.langからの実装があるため、インターフェイスの抽象メソッドカウントは には数えられません。 .Objectまたは他の場所の (重点鉱山)

したがって、問題のインターフェイスによって異なります。あなたのインターフェースが適切に定義されているようです。

関連する問題