我想知道是否可以通过向参数添加函数名来调用另一个函数。因此,例如我想制作一个包含4个部分的脚本。每个部分都需要输入(我使用扫描仪,不要问为什么:P是它的分配)然后需要将它传递给另一个脚本,例如:计算和东西。
我从这开始:
static int intKiezer(String returnFunctie, String text) {
Scanner vrager = new Scanner(System.in);
while (true) {
System.out.println(text);
int intGekozen = vrager.nextInt();
if (vrager.hasNextInt()) {
returnFunctie(intGekozen);
}
else {
vrager.next();
System.out.println("Verkeerde invoer!");
}
}
如您所见,我试图通过尝试调用它来获取另一个函数(returnFunctie(intgekozen))。它应该使用intgekozen作为参数调用returnFunctie。但它不起作用
我会调用这样的函数:intKiezer(sphereCalculations, "What radius do you want to have?")
。所以来自输入的答案,如果它的正确应该传递给另一个名为sphereCalculations的函数
答案 0 :(得分:3)
这是一个想法。
定义一个接口,该接口具有执行您想要执行的任何计算的方法。例如:
interface Algorithm {
int execute(int value);
}
然后定义一个或多个实现接口的类,并执行您希望它们执行的任何计算。例如:
class MultiplyByTwo implements Algorithm {
public int execute(int value) {
return value * 2;
}
}
class AddThree implements Algorithm {
public int execute(int value) {
return value + 3;
}
}
然后,编写您的方法,使其接受Algorithm
作为参数。执行具有所需值的算法。
static int intKiezer(Algorithm algo, String text) {
// ...
return algo.execute(intGekozen);
}
通过传入接口Algorithm
的一个实现类的实例来调用您的方法。
int result = intKiezer(new MultiplyByTwo(), "Some question");
System.out.println("Result: " + result);
答案 1 :(得分:1)
正如@Jesper所说,有可能通过反思,而且可能只有反射。反射是一个对象可以分析自身并迭代它的成员(属性和方法)的过程。在你的情况下,似乎你正在寻找一种方法。
通过代码的外观,看起来你想要的是,事实上,将一个函数对象传递给你的代码,在那里可以应用一个参数。这在Java中是不可能的。在Java 8中添加闭包可以实现类似的功能。您可以通过将Closure作为参数或其他支持闭包或函数的语言传递给Groovy。
您可以通过定义抽象类/接口,将其实例传递给您的方法,然后调用将参数传递给它的方法来接近您想要的内容,例如:
interface Function <T> {
public Integer call(T t);
}
public class TestFunction {
static int intKiezer(Function<Integer> returnFunctie, String text)
{
int a = 10;
System.out.println(text);
return returnFunctie.call(a);
}
public static void main(String[] args)
{
Function<Integer> function = new Function<Integer>() {
public Integer call(Integer t) { return t * 2; }
};
System.out.println( intKiezer(function, "Applying 10 on function") );
}
}
如果您打算调用方法,那么最好使用一些反射库。我想起了Apache Common's MethodUtil。我想这是你的男人:
invokeMethod(Object object, String methodName, Object arg)
Invoke a named method whose parameter type matches the object type.