我想在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 );
}
然而,当我尝试将它传递给arrayOp时,它会打印错误:“找不到像FAdd这样的东西”,即使println(FAdd.eval(10,20))工作正常。因此,由于某种原因,似乎不可能将静态类作为参数传递。
你有什么建议来解决这样的任务?我实际上希望 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]; }
}