Почему 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-ограниченным решением, предложенным в статье?

Любое объяснение приветствуется.

Изменить: Обновлен код, чтобы исправить проблему компиляции.

0 ответов

Другие вопросы по тегам