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 {
8 public static abstract class Expression {
13 public abstract void visit(Visitor v);
16 public static final class Plus extends Expression {
18 private final Expression first;
19 private final Expression second;
21 public Plus(Expression first, Expression second) {
26 public Expression getFirst() {
30 public Expression getSecond() {
35 public void visit(Visitor v) {
36 if (v instanceof Visitor1_0) {
37 ((Visitor1_0) v).visitPlus(this);
44 public static final class Number extends Expression {
46 private final int value;
48 public Number(int value) {
52 public int getValue() {
57 public void visit(Visitor v) {
58 if (v instanceof Visitor1_0) {
59 ((Visitor1_0) v).visitNumber(this);
67 public static final class Minus extends Expression {
68 private final Expression first;
69 private final Expression second;
71 public Minus(Expression first, Expression second) {
75 public Expression getFirst() { return first; }
76 public Expression getSecond() { return second; }
78 // BEGIN: visitor.cleanversion.dispatch2
79 public void visit(Visitor v) {
80 if (v instanceof Visitor2_0) {
81 ((Visitor2_0)v).visitMinus(this);
86 // END: visitor.cleanversion.dispatch2
89 // BEGIN: visitor.cleanversion.v2
90 public interface Visitor {
91 public void visitUnknown(Expression e);
93 public interface Visitor1_0 extends Visitor {
94 public void visitPlus(Plus s);
95 public void visitNumber(Number n);
98 public interface Visitor2_0 extends Visitor1_0 {
99 public void visitMinus(Minus s);
101 // END: visitor.cleanversion.v2