在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>
的子类。
我应该如何解决这个问题?
答案 0 :(得分:5)
您可以使用通配符。
interface Sup { Optional<? extends A> a(); }
interface Sub extends Sup { Optional<? extends B> a(); }
我本可以只使用Optional<B>
,但使用Optional<? extends B>
允许其他界面扩展Sub
并执行相同的操作。
就我个人而言,我认为这有点混乱,最好只在必要时返回A
或B
或null
。
答案 1 :(得分:2)
更改您的父界限以使用通配符:
Optional<? extends A> // parent
Optional<? extends B> // child
您的代码现在不起作用的原因是由于泛型不变。 B
是A
,但Optional<B>
不是Optional<A>
。