Java (still)

So we use the visitor as follows:

class Main {
  public static void main(String[] args) {
    System.out.println(s(new One<Integer>(7)));
    System.out.println(s(new One<String>("hello")));
    System.out.println(s(new None<Integer>()));
  }

  static <X> String s(OneOrNone<X> o) {
    return o.visit(new OneOrNoneVisitor<String>() {
      public <T> String visit(One<T> o) { return "got one! " + o.one(); }
      public <T> String visit(None<T> n) { return "don't got one"; }
    });
  }
}