一般的な質問は、次のとおりJava 8でメソッド参照を間接的に実行する方法は?
- 構文
object::aMethod
を使用して、それが機能的インターフェイスとしてMethodHandle
ような型に変換することができますか? - いいえの場合、可能であれば、メソッド参照がJava 8で間接的に呼び出される方法を教えてください。
class MethodRefRunner { static void execute(Object target, WHATTYPE mref, Object... args) { mref.apply(args); } }
そして、それはとして使用することができます:
WHATTYPE
のための上記のスニペットではMethodRefRunner.execute(o, o::someMethod, someParam)
、一つの選択肢である
例として
、我々はMethodRefRunner
ようにしたいのですが想像java.util.function.Function
ですが、非常に限定的です。 this answerには、バージョンb75より前にはjava.util.function.Block
があり、便利な場合がありました。
WHATTYPE
は何らかの形でjava.lang.invoke.MethodHandle
に変換される可能性があります。
注:Javaの専門家に注:必要に応じて質問のタイトルを修正してください。
*メソッド*を*関数値*に強制することができます。これは*η拡張*(Scalaの*メソッド*と*関数*に違いがあります)です。あなたが記述した場合、Scalaコンパイラは両方を受け入れるほどスマートです。 – Beryllium
@Beryllium実際、Java 8がそれを選んでいない理由について私は疑問に思っていました。 – nobeh
@nobeh Java 8は、関数型を追加すると言語にはるかに大きな変更が加えられたため、機能的なインターフェイスが必要です。彼らは後で来るかもしれない。 –