java - 可选<>和返回类型缩小

标签 java option-type narrowing

在 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并做同样的事情。

就我个人而言,我认为这有点乱,最好只返回 AB , 或 null必要时。

关于java - 可选<>和返回类型缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29869548/

相关文章:

JAVA_HOME设置错误

swift - 避免在 swift 中将字符串视为可选

ios - Swift Closure 中的可选链接,其中返回类型必须为 Void

快速,可选展开,如果条件反转

TypeScript 类型推断/缩小挑战

Java Jdbctemplate 查询具有命名参数和行映射器的列表?

java - Eclipse 可从终端执行

java - Timerank 命令无法正常工作,没有任何错误

c++ - 声明具有两种类型的变量 : "int char"

java - 为什么最终变量不总是一个常量表达式?