Java 8の機能について読んでいて、メソッド参照があることがわかりましたが、メソッドがオーバーロードされたときにどのメソッドを指定するかがわかりませんでした。誰か知っていますか?
質問する
3130 次
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
ラムダ式はどこで使用できますか?
ターゲットの型が適切なパラメーターの型であるメソッドまたはコンストラクターの引数。メソッドまたはコンストラクターがオーバーロードされている場合、ラムダ式がターゲットの型に一致する前に、オーバーロード解決の通常のメカニズムが使用されます。(オーバーロードの解決後、同一の機能記述子を持つ異なる機能インターフェースを受け入れる複数の一致するメソッドまたはコンストラクター シグネチャがまだ存在する場合があります。この場合、ラムダ式はこれらの機能インターフェースのいずれかの型にキャストする必要があります);
ターゲットの型を明示的に提供するキャスト式。例えば:
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 に答える