Java中的通配符Generic和<?超级T>意义,下限或上限

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)

假设我有:

  • 定义的车辆类
  • 创建了VehicleComparator实施比较器,同时按价格比较车辆.
  • 创建卡车扩展车辆
  • 实例化卡车[] arr; VehicleComparator myComparator

现在,我这样做:

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".如此困惑......如果您对此有任何见解我会很感激..

谢谢!

Boh*_*ian 5

首先,您可以通过Vehicle[]添加Trucks来解决它.

您需要的原因<? super T>可以追溯到Comparator<Truck>不是子类型的泛型规则Comparator<Vehicle>; 无界类型T必须完全匹配,而不是.

为了Comparator传入一个合适Comparator的类,它必须是被比较的类或它的任何超类,因为在OO语言中,任何类都可以被视为超类的一个实例.因此,Comparator只要它是数组的组件类型的超类型,它的泛型类型无关紧要.