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[]