如果只有类';s字符串名称(以及方法名称/参数)-在Java中

如果只有类';s字符串名称(以及方法名称/参数)-在Java中,java,oop,methods,Java,Oop,Methods,我想创建一个可以被各种不同类调用的静态方法。所有调用此方法的类都有一个名为“evaluate”的方法,我想从该方法中调用该方法 所有涉及的类和方法都是静态的。然而,“evaluate”方法在拥有它的每个类中的实现是不同的。如何从每次调用该方法的特定类调用evaluate方法 谢谢 以下是psudeo代码/更多信息 我的项目的目标是对任意数量的sig图实现牛顿和二分法近似方法 特别是关于二分法——它应该能够处理任何可计算函数 这不是一个理想的方法,但由于我的作业(高中老师)的框架,我的每个不同的功

我想创建一个可以被各种不同类调用的静态方法。所有调用此方法的类都有一个名为“evaluate”的方法,我想从该方法中调用该方法

所有涉及的类和方法都是静态的。然而,“evaluate”方法在拥有它的每个类中的实现是不同的。如何从每次调用该方法的特定类调用evaluate方法

谢谢

以下是psudeo代码/更多信息

我的项目的目标是对任意数量的sig图实现牛顿和二分法近似方法

特别是关于二分法——它应该能够处理任何可计算函数

这不是一个理想的方法,但由于我的作业(高中老师)的框架,我的每个不同的功能都嵌入到一个

静态类,作为称为“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
  }
}

这是一个不能将静态方法放入接口的限制。解决方法是使用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很棒-看起来不错,但没有找到这个接口-将它合并到我的答案中