Java 使用通配符强制转换常量泛型

Java 使用通配符强制转换常量泛型,java,generics,casting,unbounded-wildcard,Java,Generics,Casting,Unbounded Wildcard,我正在执行静态util方法,该方法返回带空可选项的已完成未来: public class CompletableFutureUtils { private static final CompletableFuture<Optional<?>> EMPTY_FUT = completedFuture(Optional.empty()); private static final Optional<?> EMPTY_OPT = Optional

我正在执行静态util方法,该方法返回带空可选项的已完成未来:

public class CompletableFutureUtils {

    private static final CompletableFuture<Optional<?>> EMPTY_FUT = completedFuture(Optional.empty());

    private static final Optional<?> EMPTY_OPT = Optional.empty();

    @Nonnull
    @SuppressWarnings("unchecked")
    public static <T> CompletableFuture<Optional<T>> emptyOptionalCompletedFuture() {

        // COMPILE ERROR: incompatible types: CompletableFuture<Optional<?>> cannot be converted to CompletableFuture<Optional<T>>
        // return (CompletableFuture<Optional<T>>)EMPTY_FUT;

        return completedFuture((Optional<T>)EMPTY_OPT); // works, but creates new instance every time
    }
}
公共类CompletableFutureUtils{
private static final CompletableFuture EMPTY_OPT=Optional.EMPTY();
@非空
@抑制警告(“未选中”)
公共静态CompletableFuture emptyOptionalCompletedFuture(){

//编译错误:不兼容的类型:CompletableFuture首先丢弃
CompletableFuture
的类型,然后再次强制转换为所需的类型,如下所示:

return (CompletableFuture<Optional<T>>) (CompletableFuture<?>) EMPTY_FUT;
返回(CompletableFuture)(CompletableFuture)空\u FUT;

由于类型擦除
Optional
Optional
在运行时是相同的,即只是
Optional
。因此,如果您转换为原始类型,编译器会警告您,但应该毫无怨言地执行。太棒了,谢谢。不知道这种“上转换双转换”啊,它甚至可以简化空未来的上界:
CompletableFuture空未来=completedFuture(可选的.EMPTY());
然后
(CompletableFuture)
甚至不再需要了。你能用这种方法调整/编辑你的答案吗?谢谢你能,但要小心,万一你不小心把它重新用作,比如说,
completablefuture
。至少如果你把它当作
completablefuture,我明白了,只是在这种情况下重复使用没有任何意义