Я не совсем уверен, как задать этот вопрос, не публикуя здесь весь код (это совсем немного), но я постараюсь изо всех сил.Почему этот метод не рекурсивный?
У меня есть класс enum, который реализует интерфейс. Цель всей программы - представить кучу целочисленных чисел в полях. Таким образом, существует конкретный класс TrueField
, который получен из абстрактного класса AbstractField
, который реализует метод, называемый boolean sameAs(Field that)
. Этот метод также существует (он должен, из-интерфейса) в классе перечислимом:
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;
}
...
AbstractField:
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
в классе перечислений называется. Но почему он снова не называет себя рекурсивным? Поскольку существует динамическое связывание из-за интерфейса, JVM видит, что sf
является динамическим типом SimpleField.Binary
и статическим типом Field
. Я не совсем понимаю, что происходит, и почему он снова не называет себя. Надеюсь, я достаточно подробно объяснил свой вопрос.
Зачем ему снова называть себя? Он вызывает метод с именем 'sameAs' на объекте, на который ссылается' this' (если только 'this' не ссылается на тот же объект, что и' this'). –
Есть две реализации, но вы только показали нам одну из них.Было бы очень полезно, если бы вы показали * обе * реализации - в идеале короткую, но полную программу, демонстрирующую проблему. –
Вау, что было быстро, спасибо. @JonSkeet – kimsay