使用通配符强制转换常量

rad*_*tao 4 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.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
    }
}
Run Code Online (Sandbox Code Playgroud)

为了提高效率,我想返回完成的相同常量实例CompletableFuture- EMPTY_FUT,但CompletableFuture<Optional<T>>由于无界通配符而无法将其转换为.

当然我想为任何类型调用这个完整的future方法,与Optional.empty()CompletableFuture.completedFuture(U)几乎相同

如何使用无界通配符将泛型转换为特定类型?有可能吗?

And*_*ner 5

抛弃第一个类型CompleteableFuture,然后再次投射到你想要的类型,如下所示:

return (CompletableFuture<Optional<T>>) (CompletableFuture<?>) EMPTY_FUT;
Run Code Online (Sandbox Code Playgroud)