我认为unmodifiableCollection
是错误的。两种方法都打算包装Collection<T>
为Collection<T>
,没有理由更改类型参数。
当然,接受 a 更灵活Collection<? extends T>
,因此调用者可以请求将 a 转换Collection<Integer>
为不可修改的Collection<Integer>
or Collection<Number>
orCollection<Object>
等。但是谁需要呢?只读Collection<Integer>
在各方面都比Collection<Number>
无论如何都要好。
如果输入类型本身包含通配符,例如
Collection<? extends Number> someNumbers = ...;
unmodifiableCollection(Collection<? extends T>)
我们可以做
Collection<Number> readonlyNumbers
= unmodifiableCollection(someNumbers);
Collection<Object> readonlyObjects
= unmodifiableCollection(someNumbers);
但unmodifiableCollection2(Collection<T>)
我们必须
Collection<? extends Number> readonlyNumbers
= unmodifiableCollection2(someNumbers);
Collection<? extends Object> readonlyObjects
= unmodifiableCollection2(someNumbers);
第二个版本更混乱,但它可能在政治上更正确。