java泛型中的通配符和 含义,下限或上限

2024-02-16

所以我正在阅读有关通用方法的内容,但我很困惑。我先说一下这里的问题:

在此示例中:假设我需要一个适用于任何类型 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[]然后你添加了Trucks to.

你需要的理由<? super T>回到泛型规则Comparator<Truck>不是 的子类型Comparator<Vehicle>;无界类型T必须完全匹配,但事实并非如此。

为了得到一个合适的Comparator要传入,它必须是Comparator被比较的类或其任何超类,因为在 OO 语言中任何类都可以被视为超类的实例。因此,泛型类型是什么并不重要Comparator是,只要它是数组组件类型的超类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java泛型中的通配符和 含义,下限或上限 的相关文章

随机推荐