可选<>并返回类型缩小

时间:2015-04-25 19:13:11

标签: 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(); }

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

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

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

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

2 个答案:

答案 0 :(得分:5)

您可以使用通配符。

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

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

我本可以只使用Optional<B>,但使用Optional<? extends B>允许其他界面扩展Sub并执行相同的操作。

就我个人而言,我认为这有点混乱,最好只在必要时返回ABnull

答案 1 :(得分:2)

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

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

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