Javaジェネリックを使用して式の問題を解決することについて、次の論文を読んでいました。
http://www.daimi.au.dk/~madst/ecoop04/main.pdf
著者は、左右のパラメーターが EvalExp 型であることを保証するために F-Bounded 型を使用する最初のソリューションを提案します。
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 ソリューションよりも不利な点がありますか?
どんな説明でも大歓迎です。
編集: コンパイルの問題を修正するためにコードを更新しました。