我想创建一个可以被各种不同的类调用的静态方法。所有调用此方法的类都有一个名为“evaluate”的方法,我想从方法中调用它。
所涉及的所有类和方法都是静态的。然而,“评估”方法在具有它的每个类中实现不同。如何从每次调用方法的特定类中调用evaluate方法?
谢谢!
这是psudeo代码/更多信息
我的项目的目标是对任意数量的sig-figs实现Newton和Bisection近似方法
特别关于二分法 - 它应该能够使用任何可评估的函数
这不是一个理想的方法,但由于我的任务框架(高中老师),我的每个不同的功能都嵌入了
静态类,作为名为“evaluate”的单个方法。
二分法依赖于能够一遍又一遍地调用evaluate方法来查找零。我希望能够调用每个特定类的
从单独的二分法中评估。
评估类的示例:
//evaluate the function x^2+5x+3
public class Problem1{
public void main(String[] args){
//code here
//call bisectionMethod() here
}
//various other methods
//the one that i'm concerned about
public static double evaluate(double input){
//return output for x^2+5x+3
}
} //several classes like this, with different functions
public class Bisection{
//filler methods
//this one:
public static double[] bisectionMethod(){ //don't know if it should have inputs - it has to be able to figure out which eval it's using
//do the bisection method
call evaluate(double input) here
}
}
答案 0 :(得分:3)
这是一个限制,你不能将静态方法放入接口。解决方法是使用Java Reflection API:
public Object callStaticEvaluate(Class<?> clazz, double input) throws Exception {
return clazz.getMethod("evaluate", double.class).invoke(null, input);
}
答案 1 :(得分:2)
鉴于Java 8语法,除了使用接口和反射之外还有第三种方法:
在Bisection
写
import java.util.function.DoubleUnaryOperator;
public class Bisection {
public static double[] bisectionMethod(DoubleUnaryOperator evalFn, <other args>)
// invoke the function
double in = ...;
double out = fn.applyAsDouble(in);
...
}
}
并使用静态评估函数的方法句柄调用Bisection
:
Bisection.bisectionMethod(Problem1::evaluate)
答案 2 :(得分:1)
你不能通过任何干净的方式做到这一点.OOP不支持任何这样的结构。你必须使用反射。 Invoking a static method using reflection
所以它会是 -
public static <T extends XXX> void evaluate(Class<T> c){
// invoke static method on c using reflection
}