It always surprises me how things change when one really tries to implemente them. The whole approach with non-monotinic evolution was uncompilable. We need a common super type for all the visitors\!
1 package org.apidesign.visitor;
3 public final class Language {
6 public static abstract class Expression {
7 public abstract void visit(Visitor v);
9 public static final class Plus extends Expression {
10 private final Expression first;
11 private final Expression second;
13 public Plus(Expression first, Expression second) {
17 public Expression getFirst() { return first; }
18 public Expression getSecond() { return second; }
20 public void visit(Visitor v) { v.visitPlus(this); }
22 public static final class Number extends Expression {
23 private final int value;
24 public Number(int value) { this.value = value; }
25 public int getValue() { return value; }
27 public void visit(Visitor v) { v.visitNumber(this); }
30 public static final class Minus extends Expression {
31 private final Expression first;
32 private final Expression second;
34 public Minus(Expression first, Expression second) {
38 public Expression getFirst() { return first; }
39 public Expression getSecond() { return second; }
41 public void visit(Visitor v) {
42 if (v instanceof Visitor2_0) {
43 ((Visitor2_0)v).visitMinus(this);
49 // BEGIN: visitor.nonmonotonic.real
51 public final class Real extends Expression {
52 private final double value;
53 public Real(double value) {
56 public double getValue() {
59 public void visit(Visitor v)
60 // FINISH: visitor.nonmonotonic.real
66 public interface Visitor {
67 public void visitUnknown(Expression e);
69 public interface Visitor1_0 extends Visitor {
70 public void visitPlus(Plus s);
71 public void visitNumber(Number n);
74 public interface Visitor2_0 extends Visitor {
75 public void visitMinus(Minus s);
77 // BEGIN: visitor.nonmonotonic.visitor
79 public interface Visitor3_0 extends Visitor {
80 public void visitPlus(Plus s);
81 public void visitMinus(Minus s);
82 public void visitReal(Number n);
84 // END: visitor.nonmonotonic.visitor