Почему thenApply и thenApplySync не работают со стадией завершения - PullRequest
0 голосов
/ 10 ноября 2019

Прежде всего, очевидно, что я плохо понимаю thenApply, и поэтому я прихожу с ошибкой компилятора, но я попытался выполнить поиск и не смог.

Вотмой простой код:

import java.util.concurrent.CompletionStage;

public class Main5 {
    public static void main(String[] args) {

    }

    static class Game {
        public void doIt(int id) {
            CompletionStage<Player> player = getPlayer(id).thenApplyAsync(p -> {
                modifyPlayer(p.getId());
                return getPlayer(p.getId());
            });
        }

        private CompletionStage<Player> getPlayer(int id) {
            //do http request to get the player info
        }

        private CompletionStage<Void> modifyPlayer(int id) {
            //do http request to modify player's info
        }
    }
}

В thenApplySync я получаю эту ошибку компилятора:

incompatible types: inference variable U has incompatible bounds
    equality constraints: com.testapp.Player
    lower bounds: java.util.concurrent.CompletionStage<com.testapp.Player>

Метод getPlayer уже возвращает этап завершения, так что с этим не так? ?

Я знаю, что

, если я сделаю: return getPlayer(p.getId()).toCompletableFuture().get();, это сработает, но я не понимаю, почему. По моему мнению, я должен вернуть стадию завершения, а не объект.

Помощь приветствуется.

...