可选<>并返回类型缩小

lev*_*tov 7 java optional narrowing

在Java <8中,返回"unsafe"对象(对象或null),我能够在子类中专门化返回类型:

class A {}
class B extends A {}
interface Sup { A a(); /* returns A instance, or null */ }
interface Sub extends Sup { B a(); }
Run Code Online (Sandbox Code Playgroud)

在Java 8中,如果我想让我的API"更安全",我应该返回Optional<A>而不是"raw" A:

interface Sup { Optional<A> a(); }
interface Sub extends Sup { Optional<B> a(); }
Run Code Online (Sandbox Code Playgroud)

但是不编译!因为Optional<B>不是子类Optional<A>.

我该如何解决这个问题?

Pau*_*ton 5

你可以使用通配符.

interface Sup { Optional<? extends A> a(); }

interface Sub extends Sup { Optional<? extends B> a(); }
Run Code Online (Sandbox Code Playgroud)

我本可以做到这一点,Optional<B>但使用Optional<? extends B>允许另一个接口扩展Sub并做同样的事情.

就个人而言,我认为这是一个有点乱,这将是最好只返回AB,或null在必要.