为什么
而不是:
Collections.sort(List<T>)
的签名是这样的:public static <T extends Comparable<? super T>> void sort(List<T> list)
而不是:
public static <T extends Comparable<T>> void sort(List<? extends T> list)
- 我理解它们都会起到同样的作用,那么为什么框架开发者使用了第一种选项?
- 还是说这些声明真的有所不同?
Comparable<T>
,但实际上应该使用Comparable<? super T>
。<T extends Comparable<? super T>> void sort(List<? extends T> list)
也可以工作,但在这里添加? extends T
是完全不必要的,而在max
方法中是合理的(因为max
返回值)。 - Tagir ValeevList<? extends T> list
这样的通配符类型时,你不能在方法内部执行list.set(index, list.get(anotherIndex))
,因为通配符类型的工作方式。这可以通过使用内部帮助方法来捕获? extends T
到另一个类型变量(或者像内部实现经常做的那样使用未检查的操作)来规避,但是对于将要修改的列表而言,没有通配符的类型更加简洁。 - HolgerList<? extends ...>
类型的参数不会因为PECS规则而被修改,如果你将其用于sort
方法,就需要再次查看该方法。这不仅仅是一个实现问题。 - Holger