Suppose we wish to use a collection that always has only zero or one element and we wish to dispatch based on this.
interface OneOrNone<T> { <A> A visit(OneOrNoneVisitor<A> v); } abstract class One<T> implements OneOrNone<T> { public <A> A visit(OneOrNoneVisitor<A> v) { return v.visit(this); } abstract T one(); } 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); }