Java 如何从不同对象的返回结果创建对象的强制类型

Java 如何从不同对象的返回结果创建对象的强制类型,java,generics,casting,wildcard,Java,Generics,Casting,Wildcard,如果某个方法返回一个String[] 因此,我有一个队列中的CompletableFuture,我想知道如何正确地强制转换它,而不必总是检查我的特定案例 这就是我目前拥有的 CompletableFuture<?> cb = cbQueue.poll(); switch(subChannel) { case "GetServers": ((CompletableFuture<String[]>) cb).compl

如果某个方法返回一个
String[]

因此,我有一个队列中的
CompletableFuture
,我想知道如何正确地强制转换它,而不必总是检查我的特定案例

这就是我目前拥有的

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

    switch(subChannel) {
        case "GetServers":
            ((CompletableFuture<String[]>) cb).complete(in.readUTF().split(", "));
            break;
    }
CompletableFuture cb=cbQueue.poll();
交换机(子信道){
案例“GetServers”:
((CompletableFuture)cb.complete(in.readUTF().split(“,”));
打破
}
但是我希望我能写

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

    switch(subChannel) {
        case "GetServers":
            complete(cb, in.readUTF().split(", "));
            break;
    }
CompletableFuture cb=cbQueue.poll();
交换机(子信道){
案例“GetServers”:
完成(cb,in.readUTF().split(“,”);
打破
}
它将根据传递的类型进行适当的强制转换(在本例中为String[])
这是因为我有很多检查案例,我只是好奇,这样我就不必不必要地强制转换了

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

  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);
  }
public void stuff(){
CompletableFuture c=新的CompletableFuture();
完整(c,“bla”);
}
私有静态无效完成(可完成的未来c、T值){
(可完成的未来)c.完成(价值);
}

像这样的问题的解决方案通常是一层间接的。在
队列
CompletableFuture
之间,或者在
CompletableFuture
字符串[]
之间引入另一个对象

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

这里有不同类型的
Sometype
实现,例如
String[]

好的,但是如果他想将它转换为String[]以外的其他类型呢?然后呢?@MS90您有多个
Sometype
实现。他们中的一些人可能会使用
String[]
他们中的一些人可能会使用其他类型的字符串。这是一个很好的解决方案,但不幸的是不安全!我对不安全很好,我只是完全例外,为此干杯,这么简单,我肯定是过于复杂了哈哈
Queue<CompletableFuture<Sometype>> -> CompletableFuture<Sometype> -> Sometype -> String[]