Optional<> 和 return 类型缩小
Optional<> and return type narrowing
在 Java < 8 中,returning "unsafe" 对象(对象或 null),我能够在子类中专门化 return 类型:
class A {}
class B extends A {}
interface Sup { A a(); /* returns A instance, or null */ }
interface Sub extends Sup { B a(); }
在 Java 8 中,如果我想让我的 API "safer",我应该 return Optional<A>
而不是 "raw" A
:
interface Sup { Optional<A> a(); }
interface Sub extends Sup { Optional<B> a(); }
但是编译不通过!因为 Optional<B>
不是 Optional<A>
.
的子类
我该如何解决这个问题?
更改您的父边界以使用通配符:
Optional<? extends A> // parent
Optional<? extends B> // child
您的代码现在不起作用的原因是泛型是不变的。 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>
允许另一个接口扩展 Sub
并做同样的事情。
就我个人而言,我认为这有点乱,在必要时最好只 return A
或 B
,或 null
。
在 Java < 8 中,returning "unsafe" 对象(对象或 null),我能够在子类中专门化 return 类型:
class A {}
class B extends A {}
interface Sup { A a(); /* returns A instance, or null */ }
interface Sub extends Sup { B a(); }
在 Java 8 中,如果我想让我的 API "safer",我应该 return Optional<A>
而不是 "raw" A
:
interface Sup { Optional<A> a(); }
interface Sub extends Sup { Optional<B> a(); }
但是编译不通过!因为 Optional<B>
不是 Optional<A>
.
我该如何解决这个问题?
更改您的父边界以使用通配符:
Optional<? extends A> // parent
Optional<? extends B> // child
您的代码现在不起作用的原因是泛型是不变的。 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>
允许另一个接口扩展 Sub
并做同样的事情。
就我个人而言,我认为这有点乱,在必要时最好只 return A
或 B
,或 null
。