Ich versuche, eine CAS-ähnliche Sache in Java zu implementieren, aber ich habe Probleme mit der Auswahl der Typen und Methoden.Seltsames Verhalten
Wenn ich die beiden Subtypen hinzufüge, ist alles in Ordnung. Wenn ich einen Subtyp mit einem Supertyp hinzufüge, tritt eine unendliche Rekursion auf. Wenn der Supertype wieder in Ordnung ist, ist es wieder in Ordnung, und wenn ich einen Supertyp zu einem Subtyp hinzufüge, tritt die gleiche Rekursion wieder auf.
Kann jemand erklären, was hier passiert und was ich falsch mache?
public class MathMain{
public static void main(String[] args){
Constant constant = new Constant(1);
constant.add(constant);
MathObject mathObject = (MathObject)constant;
constant.add(mathObject);
constant.add((Constant)mathObject);
mathObject.add(constant);
}
}
public abstract class MathObject{
public abstract MathObject add(MathObject addend);
public abstract MathObject substract(MathObject subtrahend);
}
public class Constant extends MathObject{
public final double c;
public Constant(double c){
this.c = c;
}
public MathObject add(MathObject that){
return that.add((Constant)this);
}
public MathObject substract(MathObject that){
return that.substract((Constant)this);
}
public Constant add(Constant addend){
return new Constant(c + addend.c);
}
public Constant substract(Constant subtrahend){
return new Constant(c - subtrahend.c);
}
}
Danke für dieses Versehen des Hinweis auf :) I habe an eine Problemumgehung gedacht, den Angerufenen geklont und den Aufrufer zurückgerufen, aber wie würde ich das für Objekte machen, die den ursprünglichen Zeiger erhalten müssen, z eine Variable? –
Auch warum Java nicht realisiert, dass 'MathObject add (MathObject)' 'return that.add (this)' Dies ist eigentlich eine Konstante anstelle der deklarierten MathObject, auch wenn die Methode offensichtlich in der Constant-Klasse und nicht der MathObject-Klasse befindet? Übrigens funktioniert die obige Problemumgehung aus irgendeinem Grund nicht. –
@ S.Klumpers das Argument 'das' kann eine beliebige Unterklasse von' MathObject' sein. Und da die Basis 'MathObject' keine' add (Constant addend) 'Methode hat, kann sie diese Methode nicht aufrufen, wenn Sie' that.add (this) 'schreiben, selbst wenn der Laufzeittyp von' that' ist "Konstante". – Eran