13

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

4

2 に答える 2

6

Compiler will match the method signature with the functional interface.

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

Essentially, f2 is something that can accept an Integer and return a Number, the compiler can find out that the 2nd foo() meets the requirement.

于 2013-03-27T20:01:38.167 に答える
5

この Lambda FAQから:

ラムダ式はどこで使用できますか?

  • ターゲットの型が適切なパラメーターの型であるメソッドまたはコンストラクターの引数。メソッドまたはコンストラクターがオーバーロードされている場合、ラムダ式がターゲットの型に一致する前に、オーバーロード解決の通常のメカニズムが使用されます。(オーバーロードの解決後、同一の機能記述子を持つ異なる機能インターフェースを受け入れる複数の一致するメソッドまたはコンストラクター シグネチャがまだ存在する場合があります。この場合、ラムダ式はこれらの機能インターフェースのいずれかの型にキャストする必要があります);

  • ターゲットの型を明示的に提供するキャスト式。例えば:

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

したがって、あいまいな署名がある場合はキャストする必要があります。

于 2013-03-27T20:03:25.490 に答える