interface OneOrNone<T> { <A> A visit(OneOrNoneVisitor<A> v); } class One<T> implements OneOrNone<T> { private T t; One(T t) { this.t = t; } T one() { return t; } public <A> A visit(OneOrNoneVisitor<A> v) { return v.visit(this); } } class None<T> implements OneOrNone<T> { public <A> A visit(OneOrNoneVisitor<A> v) { return v.visit(this); } } interface OneOrNoneVisitor<A> { <T> A visit(One<T> o); <T> A visit(None<T> n); }