3

我正在阅读以下有关使用 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 解决方案有任何缺点?

欢迎任何解释。

编辑:更新了代码以修复编译问题。

4

0 回答 0