java - Java 中的通配符 Generic 和 <? super T> 意思,下界或上界

标签 java generics wildcard extends bounded-wildcard

所以我在阅读泛型方法时感到很困惑。先说一下这里的问题:

在这个例子中:假设我需要一个适用于任何类型 T 的 selectionSort 版本,方法是使用调用者提供的外部可比较对象。

第一次尝试:

public static <T> void selectionSort(T[] arr, Comparator<T> myComparator){....}

假设我有:

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

现在,我做:

selectionSort(arr, myComparator);

它不会工作,因为 myComparator 不适用于 Vehicle 的任何子类。

然后,我这样做:

public static <T> void selectionSort(T[] arr, Comparator<? super T> myComparator){....}

这个声明会起作用,但我不完全确定我一直在做什么......我知道使用是要走的路。如果“?super T”表示“T 的未知父类(super class)型”,那么我是在施加上限还是下限?为什么 super 棒?我的意图是让 T 的任何子类都可以使用 myComparator,为什么是“?super T”。很困惑...如果您对此有任何见解,我将不胜感激..

提前致谢!

最佳答案

首先,您可以通过 Vehicle[] 来解决它然后你添加了 Truck

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

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

关于java - Java 中的通配符 Generic 和 <? super T> 意思,下界或上界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20497849/

相关文章:

Java 泛型 - 两个类型参数之间的关系

java - 如何创建带有类型参数的 java.lang.Class?

Java 泛型和通配符 : How to make this code compile?

Elasticsearch 如何使用带通配符的 multi_match

java - 获取值(value)并关闭与 recyclerview 和自定义适配器的对话框

java - 从 ArrayList<T> 构建 JTable

java - 键盘快捷键无意中触发Java的UndoManager撤消功能

java - 递归函数查找数组中最大的

Java - 泛型类型 - 类型删除

mysql - 在 Windows 7 上将通配符与 mysqlimport 一起使用