java - 为什么有 <?在 java.util.Collections.unmodifiableList API 中扩展 T> 而不是 <T>

标签 java generics collections

为什么会有<?e extends T>而不是 <T>在不可修改的 API 中 java.util.Collections 例如考虑 unmodifiableLis接口(interface)

public static <T> List<T> unmodifiableList(List<? extends T> list)

为什么不呢,只是

public static <T> List<T> unmodifiableList(List<T> list)

编辑: 这不是 When do Java generics require instead of and is there any downside of switching 的副本.那道题打算找出<? extends T>的重要性在 <T>如果从一个更改为另一个,将会产生什么影响。我理解这两种语法( <? extends T><T> )的区别,但是在不可修改的集合 API 的情况下,上下文(以及因此我的问题)是不同的。

最佳答案

这样你就可以做这样的事情:

List<Integer> intList = new ArrayList<Integer>();
// . . . populate intList

// now create an unmodifiable version:
List<Number> numList = Collections.unmodifiableList(intList);

请注意,因为泛型不是协变的,所以您不能从 List<Integer> 赋值。到 List<Number> :

numList = intList;

即使每个元素都是赋值兼容的。如果您更改了 unmodifiableList 的签名正如您所建议的那样,它会遇到同样的问题(因为一旦参数被绑定(bind),我的示例中的返回类型将被强制为 List<Integer>)。

关于java - 为什么有 <?在 java.util.Collections.unmodifiableList API 中扩展 T> 而不是 <T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23976344/

相关文章:

使用 getStringArray 时出现 java.lang.NullPointerException

泛型的 Java Map 编译器错误

java - 集合列表和子类初始化

Java如何在修改集合时对其进行分区

javascript - JSP 中未正确返回 JSON 字符串

java泛型与 map 通配符

c# - 泛型方法类型参数的类型推断

c# - 在 C# : Taking very long 中迭代大型集合

java - 为什么通用列表的声明有所不同?

java - Heroku + Spring Boot : @Scheduled not running at correct times