【问题标题】:How can I safely upcast an Optional? [duplicate]我怎样才能安全地向上转换一个 Optional? [复制]
【发布时间】:2020-08-02 02:38:52
【问题描述】:

假设我有一个Optional<Exception> 并想将其转换为Optional<Throwable>。有没有更漂亮的方法来做到这一点,而不是:

Optional<Exception> optionalException = Optional.of(new Exception());
Optional<Throwable> optionalThrowable = (Optional<Throwable>) (Optional<? extends Throwable>) optionalException;

此解决方案在 IntelliJ 中生成 lint 警告。

Unchecked cast: 'java.util.Optional<capture<? extends java.lang.Throwable>>' to 'java.util.Optional<java.lang.Throwable>'

【问题讨论】:

标签: java optional


【解决方案1】:

您的解决方案还可以,但缺点是要创建一个新的 Optional 实例。

另一种方法是编写一个实用方法,您可以在其中只抑制一次警告:

@SuppressWarnings("unchecked")  // Safe covariant cast.
static <T> Optional<T> upcast(Optional<? extends T> opt) {
  return (Optional<T>) opt;
}

然后在没有警告的情况下在所有地方使用它。

但更好的(如果您有控制权的话)是修复您需要Optional&lt;Throwable&gt; 以接受Optional&lt;? extends Throwable&gt; 的地方。

【讨论】:

  • 你忘了这是你写的吗? :) stackoverflow.com/a/44853739/1898563
  • @Michael 是的。我写了很多。
  • 原则上,当结果引用与旧引用相同时,Optional.map 的实现可以跳过创建新的Optional 实例。但是,创建Optional 的成本可能不足以证明花时间进行这种优化是合理的。
【解决方案2】:

找到了:

Optional<Exception> optionalException = Optional.of(new Exception());
Optional<Throwable> optionalThrowable = optionalException.map(Function.identity());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-28
    • 2012-10-02
    • 1970-01-01
    • 2018-07-09
    • 2016-11-05
    • 2012-04-15
    • 2015-09-16
    相关资源
    最近更新 更多