所以我正在阅读有关通用方法的内容,但我很困惑。我先说一下这里的问题:
在此示例中:假设我需要一个适用于任何类型 T 的选择排序版本,方法是使用调用者提供的外部比较。
第一次尝试:
public static <T> void selectionSort(T[] arr, Comparator<T> myComparator){....}
假设我有:
- 定义的车辆类别
- 创建了 VehicleComparator 实现 Comparator,同时
通过价格比较车辆。
- 创建卡车扩展车辆
- 实例化 Truck[] arr ;车辆比较器 myComparator
现在,我这样做:
selectionSort(arr, myComparator);
它不会工作,因为 myComparator 不适用于 Vehicle 的任何子类。
然后,我这样做:
public static <T> void selectionSort(T[] arr, Comparator<? super T> myComparator){....}
这个声明会起作用,但我不完全确定我一直在做什么......我知道使用是要走的路。如果“? super T”意味着“T 的未知超类型”,那么我是否强加了上限或下限?为什么超级呢?我的意图是让T的任何子类都可以使用myComparator,为什么是“?super T”。很困惑...如果您对此有任何见解,我将不胜感激。
先谢谢了!
首先,你可以通过以下方式解决它Vehicle[]
然后你添加了Truck
s to.
你需要的理由<? super T>
回到泛型规则Comparator<Truck>
不是 的子类型Comparator<Vehicle>
;无界类型T
必须完全匹配,但事实并非如此。
为了得到一个合适的Comparator
要传入,它必须是Comparator
被比较的类或其任何超类,因为在 OO 语言中任何类都可以被视为超类的实例。因此,泛型类型是什么并不重要Comparator
是,只要它是数组组件类型的超类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)