Vic*_* J. 6 java generics extends wildcard bounded-wildcard
所以我正在阅读泛型方法,我感到困惑.我先说一下这个问题:
在这个例子中:假设我需要一个适用于任何类型T的selectionSort版本,通过使用调用者提供的外部可比较.
第一次尝试:
public static <T> void selectionSort(T[] arr, Comparator<T> myComparator){....}
Run Code Online (Sandbox Code Playgroud)
假设我有:
现在,我这样做:
selectionSort(arr, myComparator);
Run Code Online (Sandbox Code Playgroud)
并且它不起作用,因为myComparator不适用于Vehicle的任何子类.
然后,我这样做:
public static <T> void selectionSort(T[] arr, Comparator<? super T> myComparator){....}
Run Code Online (Sandbox Code Playgroud)
这个声明会起作用,但我不完全确定我一直在做什么......我知道使用是要走的路.如果"?super T"的意思是"一个未知的超类型T",那么我是强加上限还是上限?为什么超级?我的目的是让T的任何子类使用myComparator,为什么"?super T".如此困惑......如果您对此有任何见解我会很感激..
谢谢!
首先,您可以通过Vehicle[]添加Trucks来解决它.
您需要的原因<? super T>可以追溯到Comparator<Truck>不是子类型的泛型规则Comparator<Vehicle>; 无界类型T必须完全匹配,而不是.
为了Comparator传入一个合适Comparator的类,它必须是被比较的类或它的任何超类,因为在OO语言中,任何类都可以被视为超类的一个实例.因此,Comparator只要它是数组的组件类型的超类型,它的泛型类型无关紧要.