如何根据其他对象的返回结果创建对象的强制类型

时间:2018-12-22 11:23:10

标签: java generics casting wildcard

如果某个方法返回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 :(得分:1)

解决此类问题的方法通常是间接层。在QueueCompletableFuture之间或CompletableFutureString[]之间应该引入另一个对象。

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

其中有针对不同Sometype类型的CompletableFuture实现

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

其中有Sometype个针对不同类型的实现,例如String[]

答案 1 :(得分:0)

您可以添加一个辅助方法...由于未经检查的强制转换,这仍然有可能在运行时出错

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