これはこの質問に関連しています:関数合成を行う方法?
メソッド参照をとして宣言された変数に割り当てることができることに気付いたFunction
ので、andThen
またはをcompose
持つ必要があると想定しているため、直接作成できると期待しています。しかし、それらを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 twelve = methods.operate(1、(MyMethods :: triple).andThen(MyMethods :: quadruple)); ^ 1エラー
(実際、EclipseのエラーがJava 8コンパイラのエラーと異なるのはなぜですか?)
Brian Goetz(Java ラムダのプロジェクトリーダー)が言うように、「ラムダ式には組み込み型はありません」(メソッド参照にも適用されます)。これがFunction
、メソッドが使用可能になる前に型にキャスト(または割り当て)する必要がある理由です。
EclipseがJDKコンパイラー(javac)からの異なるエラーメッセージを表示する理由は、Eclipseがecjと呼ばれる独自のJavaコンパイラーを使用するためです。これはjavacとはまったく異なるプログラムです。ところで、これが、完全なJDKのインストールを必要とせずにEclipseをJREで実行できる理由です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加