java - 在嵌套泛型类型上使用通配符,例如 CompletableFuture<List<?延伸一些东西>>

标签 java generics

这有效(编译和运行没有问题):

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/

相关文章:

java - 如何将数据类型作为参数传递以创建此类型的 ArrayList?

java - 使用 java 程序运行 java 脚本

java - 如何只打印出 java 中有 5 个元素的数组的前 3 个元素?

java - 将 msgpack 添加为 spring mvc + boot 的内容协商

java - 等待所有线程完成其工作,然后测量耗时

混合泛型类型的 Swift 数组

c# - 如何注册通用服务

c# - 泛型继承

c# - 使用构造的返回类型覆盖通用基类属性

c# - 带有额外泛型类型的奇怪的重复模板模式