The Optional.or method was added in Java 9. This is the method signature
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
Why is the type parameter of the Supplier taking ? extends Optional rather than just Optional, since Optional is a final class?
The same is true for the Optional.flatMap method. This is a change from Java 8.
In Java 8, it was Function<? super T, Optional<U>> mapper whereas it was changed to Function<? super T,? extends Optional<? extends U>> in Java 9.
I found the reasoning behind this from Stuart Marks himself
http://mail.openjdk.java.net/pipermail/core-libs-dev/2016-October/044026.html
This has to do with nested generics (
Optionalis nested withinFunction). From the mail thread