私は Java でいくつかの数値計算を行い、操作を本当にモジュール化するために、関数を他の関数のパラメーターとして渡したいと考えています。私は検索していましたが、通常は関数をワープするクラスを使用してJavaで行われます。私は実際にこれらのクラスをインスタンス化する必要はなく (内部にデータはありません)、可能な限り高速にしたいと考えています (最終的な静的メソッドは JIT コンパイラによってインライン化されるとどこかに書かれています)。だから私はこのようなものを作りました
public static class Function2 {
public static float eval(float a, float b){ return Float.NaN; }
}
public static class FAdd extends Function2 {
public static float eval(float a, float b){ return a+b; }
}
public static class Fmult extends Function2 {
public static float eval(float a, float b){ return a*b; }
}
void arrayOp( float [] a, float [] b, float [] out, Function2 func ){
for (int i=0; i<a.length; i++){ out[i] = func.eval( a[i], b[i] ); }
}
float [] a,b, out;
void setup(){
println( FAdd.eval(10,20) );
arrayOp( a,b, out, FAdd );
}
ただし、println( FAdd.eval(10,20) ) が正常に動作しているにもかかわらず、arrayOp に渡そうとすると、「FAdd のようなものが見つかりません」というエラーが出力されます。そのため、何らかの理由で静的クラスをパラメーターとして渡すことは不可能のようです。
そのようなタスクを解決するために何をお勧めしますか? 実際には、FAdd をマクロのようなものにしたいのですが、arrayOp を polymorf にする必要があります (渡すマクロに応じて動作します)。しかし、計算速度を向上させるために、(実行時ではなく) コンパイル時に解決されるのが理想的です。コンパイルされた結果は、私が書いた場合と同じになるはずです
void arrayAdd( float [] a, float [] b, float [] out ){
for (int i=0; i<a.length; i++){ out[i] = a[i] + b[i]; }
}
void arrayMult( float [] a, float [] b, float [] out ){
for (int i=0; i<a.length; i++){ out[i] = a[i] * b[i]; }
}