これは、次の質問に関連しています:関数合成を行う方法は?
Function
として宣言された変数にメソッド参照を割り当てることができるandThen
ことに気付きましたcompose
。しかし、明らかに、それらを or で呼び出す前に、最初に宣言された (またはFunction
呼び出し前に型キャストされた) 変数にそれらを割り当てる必要があります。andThen
compose
これがどのように機能するかについて、誤解があるのではないかと思います。
だから私の質問:
andThen
メソッドを呼び出す前に、型キャストまたは変数への割り当てを行う必要があるのはなぜですか?- この方法で実行する必要があるメソッド参照のタイプは正確には何ですか?
以下サンプルコード。
public class MyMethods{
public static Integer triple(Integer a){return 3*a;}
public static Integer quadruple(Integer a){return 4*a;}
public int operate(int num, Function<Integer, Integer> f){
return f.apply(num);
}
public static void main(String[] args){
MyMethods methods = new MyMethods();
int three = methods.operate(1, MyMethods::triple); // This is fine
// Error below
// int twelve = methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple));
// But this one is fine
Function<Integer, Integer> triple = MyMethods::triple;
Function<Integer, Integer> quadruple = MyMethods::quadruple;
int twelve = methods.operate(1, triple.andThen(quadruple));
// This one is also fine
int twelve2 = methods.operate(1, ((Function<Integer, Integer>)MyMethods::triple).andThen(MyMethods::quadruple));
}
}
エラーの詳細説明
Eclipse では、エラー メッセージで強調表示されます。
この式の対象の型は関数型インターフェイスでなければなりません
Java 8コンパイラでは、エラーは次のとおりです。
java8test.java:14: エラー: ここではメソッド参照が予期されていません int 12 = Methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple)); ^ 1 エラー
(実際、Eclipse のエラーが Java 8 コンパイラーのエラーと異なるのはなぜですか?)