内部的Casting类型可选

时间:2017-12-04 12:17:57

标签: java java-8 optional

我有以下内容:

class Foo implements Inter {
    void doSomething();
}

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

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

该方法结尾处的地图纯粹是为了转换类型。有更优雅的选择吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

另一种方法是在Foo中编辑方法签名,使其成为以下内容:

class Foo implements Inter {
    Inter doSomething() {
        ...
        return this;
    }
}

现在,您可以将getPossible简化为以下内容:

Optional<Inter> getPossible() {
    Optional<Foo> possible = ...;
    return possible.map(Foo::doSomething);
}

答案 2 :(得分:0)

要明确说明您只需要强制转换,可以将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);
}