我不太确定如何在不在这里发布整个代码的情况下提出这个问题(相当多),但我会尽力而为。
我有一个实现接口(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/