英文:
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 中会生成一个警告:
未检查的转换:'java.util.Optional<capture<? extends java.lang.Throwable>>' 转换为 'java.util.Optional<java.lang.Throwable>'
英文:
Suppose I have an Optional<Exception>
and want to cast it to an Optional<Throwable>
. Are there any prettier ways of doing this rather than:
Optional<Exception> optionalException = Optional.of(new Exception());
Optional<Throwable> optionalThrowable = (Optional<Throwable>) (Optional<? extends Throwable>) optionalException;
This solution generates a lint warning in IntelliJ.
Unchecked cast: 'java.util.Optional<capture<? extends java.lang.Throwable>>' to 'java.util.Optional<java.lang.Throwable>'
答案1
得分: 4
我理解您只需要代码部分的中文翻译,不需要其他回答。以下是您提供的代码的中文翻译:
找到了:
Optional<Exception> optionalException = Optional.of(new Exception());
Optional<Throwable> optionalThrowable = optionalException.map(Function.identity());
英文:
Found it:
Optional<Exception> optionalException = Optional.of(new Exception());
Optional<Throwable> optionalThrowable = optionalException.map(Function.identity());
答案2
得分: 2
你的解决方案是可以的,但缺点是会创建一个新的 Optional
实例。
另一种方法是编写一个实用方法,在该方法中,您可以一次性地抑制警告:
@SuppressWarnings("unchecked") // 安全的协变转换。
static <T> Optional<T> upcast(Optional<? extends T> opt) {
return (Optional<T>) opt;
}
然后在所有需要的地方使用这个方法,就不会出现警告。
但更好的做法(如果您有控制权的话)是修复需要接受 Optional<Throwable>
的地方,使其接受 Optional<? extends Throwable>
。
英文:
Your solution is OK, but has the downside of creating a new Optional
instance.
An alternative is to write a utility method, in which you can suppress the warning just once:
@SuppressWarnings("unchecked") // Safe covariant cast.
static <T> Optional<T> upcast(Optional<? extends T> opt) {
return (Optional<T>) opt;
}
and then just use this in all the places without warnings.
But better (if you have the control to do so) is to fix the place where you need an Optional<Throwable>
to accept an Optional<? extends Throwable>
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论