我怎样才能安全地向上转换一个可选的?
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>
.
假设我有一个 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>
.