Приведение константы общего с подстановочным знаком
Я делаю статический метод, который возвращает завершенное будущее с пустым необязательным:
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;