首页 > 解决方案 > Java泛型方法使用compareTo方法问题从集合中查找'max'对象

问题描述

让我们假设我们有

class A implements Comparable<A>

class B extends A

现在,我想要一个通用方法,使用compareTo方法从集合中找到最大的对象。

如果我这样声明这个方法:

public static <T extends Comparable<T>> T max(List<T> list)

它不适用于参数List<B> list,因为BComparable使用 type参数化B。为了使这种方法起作用,我改变似乎很自然

Comparable<T>

Comparable<? super T>

因此,更改后的方法将如下所示:

public static <T extends Comparable<? super T>> T max(List<T> list)

现在传递参数List<B> list工作正常并且没有错误。美好的。但是当我将方法签名更改为

public static <T extends Comparable<T>> T max(List<? extends T> list)

它也适用于争论List<B> list!我的问题是为什么。有人可以向我解释一下吗?谢谢 :)

标签: javagenerics

解决方案


List<? extends T>意思是“一个列表。我们不知道列表是什么,但无论它是什么,我们都知道它扩展了 T 或者是 T 本身。”

这样做的一个效果是,当我们从 List 中获取一个元素时,编译器会知道它是 T 类型。该项目的实际运行时类可能是 T 的子类型,多态性总是如此,但没有人关心那个。我们知道它可以存储在变量类型 T 中。

另一个影响是我们不能在 List 中放入任何元素,因为我们不知道 List 是什么。因此,无论我们尝试放入什么,我们都不知道它是否是可接受的类型,因此我们不能。但是当找到最大值时,这并不重要:无论如何我们都不会添加任何东西。

因此,如果需要,List<B>也可以将 a 视为 a List<? extends A>(突然决定我们不知道不关心 List 是什么,但无论它扩展 A 是什么。)这很有帮助,因为它允许匹配方法签名,以 T 为 A。


推荐阅读