Приведение константы общего с подстановочным знаком

Я делаю статический метод, который возвращает завершенное будущее с пустым необязательным:

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
    }
}

Ради эффективности я хочу вернуть один и тот же постоянный экземпляр завершенного CompletableFuture - EMPTY_FUT, но не могу привести его к CompletableFuture<Optional<T>> из-за неограниченного подстановочного знака.

Конечно, я хочу вызвать этот завершенный будущий метод для любого типа, почти так же, как Optional.empty() и CompletableFuture.completedFuture(U)

Как привести общий с неограниченным подстановочным знаком к определенному типу? Это вообще возможно?

1 ответ

Решение

Отбросьте тип CompleteableFuture сначала, затем снова приведите к нужному типу, например так:

return (CompletableFuture<Optional<T>>) (CompletableFuture<?>) EMPTY_FUT;
Другие вопросы по тегам