我想在Java中实现CAS类似的东西,但我正在努力处理类型和方法选择。奇怪的类型行为
当我添加这两个亚型时,一切都很好。 当我添加一个超类型的子类型发生无限递归。 当超类型再次罚款,当我添加一个超类型的子类型相同的递归再次发生。
有人可以解释这里发生了什么,我做错了什么?
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);
}
}
感谢您指出这个监督:) 我我想到了克隆被调用者并回调调用者的解决方法,但是如何为需要保留原始指针的对象执行此操作,例如一个变量? –
为什么Java没有意识到'MathObject add(MathObject)'return that.add(this)'这个实际上是一个Constant而不是声明的MathObject,即使这个方法显然位于Constant类而不是MathObject类?顺便说一下,上述解决方法由于某种原因不起作用。 –
@ S.Klumpers参数'that'可以是'MathObject'的任何子类。并且由于基础'MathObject'没有'add(常量加数)'方法,所以在编写'that.add(this)'时,它不能调用该方法,即使''that'的运行时类型是'Constant'。 – Eran