sealed interface AsyncReturn<V> {
record Success<V>(V result) implements AsyncReturn<V> { }
record Failure<V>(Throwable cause) implements AsyncReturn<V> { }
record Timeout<V>() implements AsyncReturn<V> { }
record Interrupted<V>() implements AsyncReturn<V> { }
}
AsyncResult<V> r = future.get();
switch (r) {
case Success<V>(var result): ...
case Failure<V>(Throwable cause): ...
case Timeout<V>(): ...
case Interrupted<V>(): ...
}
Раньше для этого enum-ы городил, а теперь у нас как в ржавом можно запиливать ) Такие дела, век живи - век учись.
А еще Гослинг хочет нормальный синтаксис для модификации рекордов (и видимо будущих иммутабельных value type) запилить типа:
Foo foo = new Foo(10, 20)
Foo bar = foo with { x:12}
Но это уже совсем другая история.