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>.
我该如何解决这个问题?
你可以使用通配符.
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并做同样的事情.
就个人而言,我认为这是一个有点乱,这将是最好只返回A或B,或null在必要.
| 归档时间: |
|
| 查看次数: |
1630 次 |
| 最近记录: |