2013-03-27 21 views
13

私はJava 8 featuresについて読んでいましたが、メソッド参照があることがわかりましたが、メソッドがオーバーロードされているときにどのメソッドを指定するのかわかりませんでした。誰か知っていますか?空でない引数のメソッド参照?

+0

ラムダ式は機能的インタフェースの略語であるため、メソッドの型はインタフェースのメソッドから推測可能でなければなりません。 –

+0

@LeonardBrünings:これはラムダ式ではなく、異なるメソッド参照です。ラムダ式は関数の実装です。メソッド参照は、既存のクラスからの既存のメソッドへの参照です。 –

+0

@LouisWassermanリンク先の記事によると、メソッド参照はラムダ、つまり私のタグとして実装されます。 – ArtB

答えて

5

は、ラムダ式を使用することができますか?ターゲット・タイプが 適切なパラメータのタイプであるため

  • メソッドやコンストラクタ引数。メソッドまたはコンストラクタがオーバーロードされている場合、ラムダ の式がターゲットタイプと一致する前に、 オーバーロード解決の通常のメカニズムが使用されます。 (過負荷の解決の後に、 )複数のマッチング方法またはコンストラクタが同じ 機能記述子を持つ異なる機能インターフェイスを受け入れることができる場合、ラムダ式は である必要があります。 ;

  • 明示的にターゲットタイプを提供するキャスト式。たとえば、次のように

Object o =() -> { System.out.println("hi"); };  // Illegal: could be Runnable or Callable (amongst others) 
Object o = (Runnable)() -> { System.out.println("hi"); }; // Legal because disambiguated 

だから、あなたがあいまいな署名がある場合は、それをキャストする必要があります。

6

コンパイラはメソッドシグニチャと機能インターフェイスを一致させます。

Integer foo(){...} 

Integer foo(Number x){...} 

Supplier<Number>   f1 = this::foo; //()->Number, matching the 1st foo 

Function<Integer, Number> f2 = this::foo; // Int->Number, matching the 2nd foo 

基本的に、f2Integerを受け入れ、Numberを返すことができるものである、コンパイラは、第二foo()が要件を満たしていることを知ることができます。 this Lambda FAQから

関連する問題