Как мне создать приведенный тип объекта из возвращенного результата другого объекта - PullRequest
0 голосов
/ 22 декабря 2018

Я хочу иметь возможность разыграть CompletableFuture<?>, чтобы сказать CompletableFuture<String[]>, если определенный метод возвращает String[]

Итак, у меня есть CompletableFuture<?> из очереди, и я хочузнаю, как правильно разыграть его без необходимости всегда проверять мой конкретный случай

Это то, что у меня сейчас ...

    CompletableFuture<?> cb = cbQueue.poll();

    switch(subChannel) {
        case "GetServers":
            ((CompletableFuture<String[]>) cb).complete(in.readUTF().split(", "));
            break;
    }

Но вместо этого я хочу иметь возможность просто писать...

    CompletableFuture<?> cb = cbQueue.poll();

    switch(subChannel) {
        case "GetServers":
            complete(cb, in.readUTF().split(", "));
            break;
    }

И он будет соответствующим образом приведен в соответствии с переданным типом (в данном случае, String []). Это потому, что у меня много контрольных случаев, и мне просто любопытно, что я ненужно излишне разыграть

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Решением таких проблем обычно является слой косвенности.Любой другой объект должен быть введен между Queue и CompletableFuture или между CompletableFuture и String[].

Queue<Sometype> -> Sometype -> CompletableFuture<String[]> -> String[]

, где есть Sometype реализации для различных типов CompletableFuture

или

Queue<CompletableFuture<Sometype>> -> CompletableFuture<Sometype> -> Sometype -> String[]

, где есть Sometype реализации для различных типов, таких как String[]

0 голосов
/ 22 декабря 2018

Вы могли бы добавить вспомогательный метод ... у этого все еще есть шанс ошибиться во время выполнения из-за непроверенного приведения

  public void stuff() {

    CompletableFuture<?> c = new CompletableFuture<String>();

    complete(c,"bla");

  }

  private static <T> void complete(CompletableFuture<?> c, T value) {
    ((CompletableFuture<T>) c).complete(value);
  }
...