如果只有类';s字符串名称(以及方法名称/参数)-在Java中
我想创建一个可以被各种不同类调用的静态方法。所有调用此方法的类都有一个名为“evaluate”的方法,我想从该方法中调用该方法 所有涉及的类和方法都是静态的。然而,“evaluate”方法在拥有它的每个类中的实现是不同的。如何从每次调用该方法的特定类调用evaluate方法 谢谢 以下是psudeo代码/更多信息 我的项目的目标是对任意数量的sig图实现牛顿和二分法近似方法 特别是关于二分法——它应该能够处理任何可计算函数 这不是一个理想的方法,但由于我的作业(高中老师)的框架,我的每个不同的功能都嵌入到一个 静态类,作为称为“evaluate”的单个方法 二分法依赖于能够反复调用evaluate方法来找到零。我希望能够调用每个特定类的 从单独的二分法进行评估 评估类示例:如果只有类';s字符串名称(以及方法名称/参数)-在Java中,java,oop,methods,Java,Oop,Methods,我想创建一个可以被各种不同类调用的静态方法。所有调用此方法的类都有一个名为“evaluate”的方法,我想从该方法中调用该方法 所有涉及的类和方法都是静态的。然而,“evaluate”方法在拥有它的每个类中的实现是不同的。如何从每次调用该方法的特定类调用evaluate方法 谢谢 以下是psudeo代码/更多信息 我的项目的目标是对任意数量的sig图实现牛顿和二分法近似方法 特别是关于二分法——它应该能够处理任何可计算函数 这不是一个理想的方法,但由于我的作业(高中老师)的框架,我的每个不同的功
//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
}
}
这是一个不能将静态方法放入接口的限制。解决方法是使用Java反射API:
public Object callStaticEvaluate(Class<?> clazz, double input) throws Exception {
return clazz.getMethod("evaluate", double.class).invoke(null, input);
}
public对象callStaticEvaluate(类clazz,双输入)引发异常{
返回clazz.getMethod(“evaluate”,double.class).invoke(null,输入);
}
这是一个限制,您不能将静态方法放入接口中。解决方法是使用Java反射API:
public Object callStaticEvaluate(Class<?> clazz, double input) throws Exception {
return clazz.getMethod("evaluate", double.class).invoke(null, input);
}
public对象callStaticEvaluate(类clazz,双输入)引发异常{
返回clazz.getMethod(“evaluate”,double.class).invoke(null,输入);
}
你不能通过任何干净的方式来做这件事。。OOP不支持任何此类结构。你必须使用反射 所以会是——
public static <T extends XXX> void evaluate(Class<T> c){
// invoke static method on c using reflection
}
公共静态无效评估(c类){
//使用反射在c上调用静态方法
}
你不能用任何干净的方法来做这件事。。OOP不支持任何此类结构。你必须使用反射
所以会是——
public static <T extends XXX> void evaluate(Class<T> c){
// invoke static method on c using reflection
}
公共静态无效评估(c类){
//使用反射在c上调用静态方法
}
给定Java 8语法,除了使用接口和反射,还有第三种方法:
在平分中
写入
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);
...
}
}
给定Java 8语法,除了使用接口和反射,还有第三种方法: 在
平分中
写入
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);
...
}
}
所有的类都实现了一个共同的接口吗?@bradimus我想这是他问题的重点;我认为他还没有学会接口,接口是这个问题的一个可能答案(如果我错了,请纠正我,OP)@mjones.udri我知道接口,这是一个稍有不同的问题,一般来说,我会说您正试图针对系统工作,并建议将所有其他静态类和方法转换为非静态版本。您的用例是什么?嗨,Alex-请参阅原始注释。我试图使我的问题更具体。我的一个主要问题是,这是学校作业,所以对我能做什么和不能做什么有一些奇怪的/武断的限制。所有的班级都实现了一个共同的接口吗?@bradimus我想这是他问题的重点;我认为他还没有学会接口,接口是这个问题的一个可能答案(如果我错了,请纠正我,OP)@mjones.udri我知道接口,这是一个稍有不同的问题,一般来说,我会说您正试图针对系统工作,并建议将所有其他静态类和方法转换为非静态版本。您的用例是什么?嗨,Alex-请参阅原始注释。我试图使我的问题更具体。我的一个主要问题是,这是学校作业,所以对我能做什么和不能做什么有一些奇怪/武断的限制;超类是实现OP想要的东西的干净方法。@mjones.udri不正确;静态方法不能添加到接口中,也不能在子类中虚拟化(因为并没有调用方法的实例);超类是实现OP想要的东西的干净方法。@mjones.udri不正确;静态方法不能添加到接口中,也不能在子类中虚拟化(因为没有调用方法的实例)。JDK中已经存在这样的接口:
DoubleUnaryOperator
()。此外,上面的代码存在一些问题,包括方法声明、未定义的局部变量、,还有一个与声明不匹配的方法调用。@SashaSalauyou很好-查看了这个接口,但没有找到它-将它合并到我的回答中这样的接口在JDK中已经存在:DoubleUnaryOperator
()。此外,上面的代码有几个问题,包括方法声明、未定义的局部变量、,还有一个与声明不匹配的方法调用。@SashaSalauyou很棒-看起来不错,但没有找到这个接口-将它合并到我的答案中