如何安全地将 Optional 进行向上转型?

huangapple go评论57阅读模式
英文:

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&lt;Exception&gt; optionalException = Optional.of(new Exception());
Optional&lt;Throwable&gt; 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(&quot;unchecked&quot;)  // Safe covariant cast.
static &lt;T&gt; Optional&lt;T&gt; upcast(Optional&lt;? extends T&gt; opt) {
  return (Optional&lt;T&gt;) 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&lt;Throwable&gt; to accept an Optional&lt;? extends Throwable&gt;.

huangapple
  • 本文由 发表于 2020年4月6日 23:31:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/61063339.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定