Почему F-Bounded Type используется для добавления нового метода в существующую иерархию типов
Я читал следующую статью о решении проблемы выражения с использованием Java Generics.
http://www.daimi.au.dk/~madst/ecoop04/main.pdf
Автор предлагает первое решение с использованием F-ограниченных типов, чтобы гарантировать, что левый и правый параметры имеют тип EvalExp.
Я попытался решить проблему, не используя тип F-Bounded, и в итоге получил следующий код, который, кажется, работает
public interface Exp {
void print();
}
public class Lit implements Exp {
public int value;
Lit(int value) { this.value = value; }
public void print() { System.out.print(value); }
}
public class Add<C extends Exp> implements Exp {
public C left, right;
public Add(final C left, final C right) {
this.left = left;
this.right = right;
}
@Override
public void print() {
left.print(); System.out.print("+"); right.print();
}
}
public interface EvalExp extends Exp {
int eval();
}
public class EvalLit extends Lit implements EvalExp {
public EvalLit(int value) { super(value); }
@Override
public int eval() { return value; }
}
public class EvalAdd<A extends EvalExp> extends Add<A> implements EvalExp {
public EvalAdd(A left, A right) {
super(left, right);
}
@Override
public int eval() {
return left.eval() + right.eval();
}
}
Решает ли это решение проблему выражения (будет ли она расширяемой для новых данных и операций)?
Удовлетворяет ли расширяемость кода (подробности см. В статьях).
Имеет ли вышеуказанное решение какие-либо недостатки по сравнению с F-ограниченным решением, предложенным в статье?
Любое объяснение приветствуется.
Изменить: Обновлен код, чтобы исправить проблему компиляции.