7

在 Java < 8 中,返回“不安全”对象(对象或 null),我能够在子类中专门化返回类型:

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

在 Java 8 中,如果我想让我的 API “更安全”,我应该返回Optional<A>而不是“原始” A

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

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

我应该如何解决这个问题?

4

2 回答 2

6

您可以使用通配符。

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

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

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

就个人而言,我认为这有点混乱,最好只返回Aor B,或null在必要时返回。

于 2015-04-25T19:21:04.727 回答
2

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

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

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

于 2015-04-25T19:20:42.377 回答