这有效(编译和运行没有问题):
List<? extends CharSequence> strings = null;
List<CharSequence> realStrings = new ArrayList<>();
strings = realStrings;
但是这段非常相似的代码却没有:
CompletableFuture<List<? extends CharSequence>> strings = null;
CompletableFuture<List<CharSequence>> realStrings =
CompletableFuture.completedFuture(new ArrayList<>());
strings = realStrings; // <--- ERROR
我遇到的错误是 Type mismatch: cannot convert from CompletableFuture<List<CharSequence>> to CompletableFuture<List<? extends CharSequence>>
这对我来说没有多大意义。为什么在第一个示例中将“realStrings”分配给“strings”可以,但在第二个示例中却不行?
PS:以防万一。使用 Java 8 编译。
最佳答案
泛型是不变的。这意味着如果您声明类型 CompletableFuture<List<? extends CharSequence>>
您只能分配另一个 CompletableFuture
如果它的类型参数完全匹配。
可以使用有界通配符更改此行为,就像您在第一个代码段中所示的那样。您可以分配 List<CharSequence>
到 List<? extends CharSequence>
.
您必须使用 CompletableFuture
复制该内容。 。即您可以分配 CompletableFuture<T>
到 CompletableFuture<? extends T>
。如果T = List<CharSequence>
,那么你会得到 CompletableFuture<? extends List<CharSequence>>
。但由于在这种情况下List
也是泛型类型,您可以再次应用通配符来获取 CompletableFuture<? extends List<? extends CharSequence>>
:
CompletableFuture<? extends List<? extends CharSequence>> strings = null;
CompletableFuture<List<CharSequence>> realStrings =
CompletableFuture.completedFuture(new ArrayList<>());
strings = realStrings; // <--- WORKS!
关于java - 在嵌套泛型类型上使用通配符,例如 CompletableFuture<List<?延伸一些东西>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43332758/