我正在阅读以下有关使用 Java 泛型解决表达式问题的论文。
http://www.daimi.au.dk/~madst/ecoop04/main.pdf
作者提出了第一个解决方案,使用 F-Bounded 类型来确保左右参数是 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-Bounded 解决方案有任何缺点?
欢迎任何解释。
编辑:更新了代码以修复编译问题。