为什么<?e extends T>
的不可修改的API中存在<T>
而不是java.util.Collections
例如考虑unmodifiableLis API
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的情况下,上下文(因此我的问题)是不同的。
答案 0 :(得分:3)
这样你就可以做到这样的事情:
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
的签名,则会遇到同样的问题(因为一旦参数被绑定,我的示例中的返回类型将被强制为List<Integer>
。