0

我有一个java函数的以下结构:

public void recursiveFun(Object currentReturnValue, int numRecursiveCalls) {

for(Method currentMethod: currentReturnValue.getClass().getMethods()) {
    String methodName = currentMethod.getName();
    // base case
    if(methodName.equals("getObject")) {
        Object retVal = currentMethod.invoke(currentReturnValue, null);
        System.out.println(retVal);
        return;
    }
    else {
        numRecursiveCalls++;
        currentReturnValue = currentMethod.invoke(currentReturnValue, null);
        recursiveFun(currentReturnValue, numRecursiveCalls);
        boolean previousFrame = true;
    }
 }

我设置了 2 个断点,一个在基本情况下,第二个在 previousFrame=true。它首先在我的基本情况下停止,然后我继续跨步。我发现它确实回到了前一帧,因为它将 previousFrame 设置为 true,但 currentReturnValue 的类型保持不变!它应该是不同的类型。

例如,Location 类有一个 getIdNum(),它返回一个 MyInteger 类型的对象。MyInteger 有一个返回对象的 getObject() 方法。在我的情况下,return 语句应该从 currentReturnValue 为 MyInteger 的框架中弹出并返回到 currentReturnValue 为 Location 的框架。

4

1 回答 1

1

关键是你不能改变currentReturnValue这种方式。即使currentReturnValue是对对象的引用,该引用也是按值传递的。这意味着您不能更改currentReturnValue指向哪个对象,以便更改在“父调用”中可见。

如果您能够通过引用传递引用,那将起作用(例如,就像outC# 中的参数)。然后您可以更改引用的对象,currentReturnValue它也会在父调用中更改。

通常你会让你的方法返回新的返回值,而不是尝试通过参数输出它。

于 2013-10-08T06:50:18.393 回答