我怎样才能安全地向上转换一个可选的?

How can I safely upcast an Optional?

假设我有一个 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>'

找到了:

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

您的解决方案没问题,但缺点是需要创建一个新的 Optional 实例。

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

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

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

但更好的方法(如果您有控制权的话)是修复需要 Optional<Throwable> 的地方以接受 Optional<? extends Throwable>.