-1

我想知道是否可以通过将函数名称添加到参数来调用另一个函数。因此,例如,我想制作一个包含 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 的函数

4

2 回答 2

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;
    }
}

然后,编写您的方法,使其接受 aAlgorithm作为参数。使用所需的值执行算法。

static int intKiezer(Algorithm algo, String text) {
    // ...

    return algo.execute(intGekozen);
}

通过传入 interface 的实现类之一的实例来调用您的方法Algorithm

int result = intKiezer(new MultiplyByTwo(), "Some question");
System.out.println("Result: " + result);
于 2012-11-06T15:59:06.723 回答
1

正如@Jesper 所说,反射是可能的,而且可能只有反射。反射是对象可以分析自身并遍历其成员(属性和方法)的过程。就您而言,您似乎正在寻找一种方法。

从您的代码看起来,实际上您想要的似乎是将一个函数对象传递给您的代码,其中可以应用一个参数。这在 Java 中是不可能的。通过添加闭包,Java 8 中可能会出现类似的情况。您可以在 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 的 MethodUtil。我认为这是你的男人:

invokeMethod(Object object, String methodName, Object arg)
    Invoke a named method whose parameter type matches the object type.
于 2012-11-06T16:24:41.083 回答