我有以下内容:
class Foo implements Inter {
void doSomething();
}
Optional<Inter> getPossible() {
Optional<Foo> possible = ...;
possible.ifPresent(Foo::doSomething);
return possible.map(f -> f);
}
getPossible
需要返回Optional<Inter>
,因为它覆盖了超类的实现。
该方法结尾处的地图纯粹是为了转换类型。有更优雅的选择吗?
答案 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);
}