为什么会有<?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/