java - 为什么这个方法不是递归的?

标签 java recursion methods enums

我不太确定如何在不在这里发布整个代码的情况下提出这个问题(相当多),但我会尽力而为。

我有一个实现接口(interface)的枚举类。整个程序的目的是在Fields中表示一堆整数。因此,有一个具体类 TrueField,它派生自抽象类 AbstractField,它实现了名为 boolean sameAs(Field that) 的方法。该方法也存在于枚举类中(由于接口(interface)的原因,它必须存在):

enum SimpleField implements Field{

  Empty(),Zero(0),Binary(0,1),Unsigned(Integer.MAX_VALUE);

  private Field simpleField;

  SimpleField(int... intArray){
      simpleField = new TrueField(intArray);
  }

  @Override
  public boolean sameAs(Field that){
      return that.sameAs(simpleField);
  }
}

来自TrueField的实现:

public class TrueField extends AbstractField{

private final int[] intArray;

TrueField(int... thatArray){
    intArray = thatArray;
}

@Override
public int at(int index){
    if(index<0 || index>=intArray.length){
        throw new IndexOutOfBoundsException();
    }

    return intArray[index];
}

@Override
public int length(){
    return intArray.length;
}
...

抽象字段:

public abstract class AbstractField implements Field{

@Override
public abstract int length();   


@Override
public boolean sameAs(Field that){
    if(that==null)
        throw new RuntimeException("that is null");

    boolean result = true;

    if(length()==that.length()){
        for(int i=0;i<length();i++){
            if(at(i)!=that.at(i))
                result = false;
        }
    }
    else
        result = false;

    return result;
}

@Override
public String toString(){

    String result = "";

    for(int i=0;i<length();i++){
        result += at(i);

        if(length()-i>1)
            result += ",";
    }

    return "["+result+"]";
}

}

我的问题是,当我在我的主要方法中执行类似的操作时:

Field sf = SimpleField.Binary;
Field sf2 = SimpleField.Binary;
Field tf = new TrueField(1,2);

System.out.println(sf.sameAs(sf2));

...显然,枚举类中的方法 sameAs 被调用。但为什么它不再次调用自己,那么它是递归的呢?由于接口(interface)存在动态绑定(bind),JVM 认为 sf 是动态类型 SimpleField.Binary 和静态类型 Field。我不太明白发生了什么事以及为什么它不再调用自己。我希望我已经足够清楚地解释了我的问题。

最佳答案

它不是递归的,因为 SimpleField 枚举中的 sameAs 方法调用参数对象的 sameAs 方法,该方法不是 SimpleField,而是 TrueField

因此,sameAs 方法按照 Field 类中声明的方式运行。

经过进一步检查,它可能是递归的,但前提是TrueField类中的声明也是递归的,我们可以看到它不是递归的,因为上面已经添加了这段代码。

关于java - 为什么这个方法不是递归的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27726758/

相关文章:

java - 寻找适用于 scala、java 或 python 的通用 Oauth 库

java - 通过 Spring LDAP 更改 Active Directory 密码

javascript - 递归未完全遍历具有嵌套对象的对象

c# - 在 Getter 方法中使用 'this' 关键字?

Java 当我将参数传递给此方法时,在执行该方法中的任何代码之前,它被错误地除以我的常量之一

java - 如何为 QuickFIX/J 日志配置 log4j2.xml?

java - java中元素递归计数的堆栈溢出

c# - c#中递归泛型类型的问题

scala - 如何编写递归匿名函数?

java - 如何在 Android 中多次调用一个方法