里面的铸造类型 Optional

spr*_*ter 6 java optional java-8

我有以下几点:

class Foo implements Inter {
    void doSomething();
}

Optional<Inter> getPossible() {
    Optional<Foo> possible = ...;
    possible.ifPresent(Foo::doSomething);
    return possible.map(f -> f);
}
Run Code Online (Sandbox Code Playgroud)

getPossible需要返回 anOptional<Inter>因为它覆盖了超类的实现。

方法末尾的映射纯粹是为了转换类型。有没有更优雅的选择?

Chr*_*ian 9

为了明确您只需要转换,您可以将 Class::cast 与 .map 一起使用:

class Foo implements Inter {
    void doSomething();
}

Optional<Inter> getPossible() {
    Optional<Foo> possible = ...;
    possible.ifPresent(Foo::doSomething);
    return possible.map(Inter.class::cast);
}
Run Code Online (Sandbox Code Playgroud)


spr*_*ter 2

返回 aOptional<? extends Inter>而不是Optional<Inter>

  • 如果“getPossible 需要返回一个Optional&lt;Inter&gt;,因为它覆盖了超类的实现”为 true,则将子类中的返回类型更改为 `Optional&lt;? extends Inter&gt;` 不应该编译,除非你也可以改变超类 (4认同)
  • 除此之外,强烈建议不要使用带有通配符的返回类型。 (4认同)