Я пытаюсь реализовать CAS как вещь на Java, но я борюсь с типами и выбором метода.Поведение странного типа
Когда я добавляю два подтипа, все в порядке. Когда я добавляю подтип с супертипом, возникает бесконечная рекурсия. Когда супертип снова отменяется, и когда я добавляю супертип к подтипу, повторяется повторная рекурсия.
Может кто-нибудь объяснить, что здесь происходит и что я делаю неправильно?
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)' 'возвращает that.add (this)' это на самом деле константа вместо объявленного MathObject, даже если метод явно находится в классе Constant, а не в классе MathObject? Кстати, обходной путь выше не работает ни по какой-то причине. –
@ S.Klumpers аргумент 'that' может быть любым подклассом' MathObject'. А так как в базе 'MathObject' нет метода' add (Constant addend) ', он не может вызывать этот метод при написании' that.add (this) ', даже если тип выполнения' that' равен 'Constant'. – Eran