在 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>
的子类.
我该如何解决这个问题?
最佳答案
您可以使用通配符。
interface Sup { Optional<? extends A> a(); }
interface Sub extends Sup { Optional<? extends B> a(); }
我本来可以做到的 Optional<B>
但使用 Optional<? extends B>
允许另一个接口(interface)扩展 Sub
并做同样的事情。
就我个人而言,我认为这有点乱,最好只返回 A
或 B
, 或 null
必要时。
关于java - 可选<>和返回类型缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29869548/