Optional<> 和 return 类型缩小

Optional<> and return type narrowing

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

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

在 Java 8 中,如果我想让我的 API "safer",我应该 return Optional<A> 而不是 "raw" A:

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

但是编译不通过!因为 Optional<B> 不是 Optional<A>.

的子类

我该如何解决这个问题?

更改您的父边界以使用通配符:

Optional<? extends A> // parent
Optional<? extends B> // child

您的代码现在不起作用的原因是泛型是不变的。 BA,但 Optional<B> 不是 Optional<A>

您可以使用通配符。

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

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

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

就我个人而言,我认为这有点乱,在必要时最好只 return AB,或 null