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

时间:2014-06-01 02:52:09

标签: java generics collections

为什么<?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的情况下,上下文(因此我的问题)是不同的。

1 个答案:

答案 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>