public static <T> int maks(List<T> list, Comparator<? super T> c)
{
// return max in a list
}
答案 0 :(得分:2)
以下是一个非常典型的通用方法声明:
public static <T> int max(List<T> list, Comparator<? super T> c) {
:
:
}
通用声明有两种:1)泛型类/接口,2)泛型方法。一旦你对这两个成语感到满意,你就可以很好地理解泛型。原始类型声明是:
public static int max(List list, Comparator c) {
:
:
}
原始类型声明使得很容易看到此方法向其int类型的调用者返回一个值。该方法接受两个参数:List实例和Comparator实例。
原始类型声明的问题在于它不安全。为什么?因为List<E>
和Comparator<T>
都是使用正式泛型类型参数定义的泛型类。如果您使用泛型类,但不指定其参数(如上面的声明中所示),则会丢失泛型为您提供的所有类型安全性和表现力。
通用方法的特征在于以下方法:
public <T> MyType myMethodName( /* parameters */) { ... }
请注意,泛型方法在方法声明中使用其类型参数声明,并且类型参数紧接在返回类型之前。这是标准的。
在这种情况下,<T>
表示方法的无界类型参数。无论何时T出现在您的方法中,传递给您的方法的实际类型参数将取代T.通常但不是必须使方法参数依赖于T(但是T可以出现在方法体内的任何位置,即可以出现类型声明 - 除了类型擦除所必需的一些例外情况。)
在您的示例中,参数列表是......
(List<T> list, Comparator<? super T> c)
指定传递给方法的实例list
的第一个参数将具有List类型。因为T是方法声明中列出的泛型方法类型参数,所以可以想象它替换了传递给方法的实际类型参数,例如。 List<String> list.
第二个参数有点复杂。它是有界通配符类型参数。 ?
的语义是“任何类型”,super
的语义是“任何类是同一个类或超类”。因此,第二个参数读作“传递给您的方法的任何类型或实际类型参数T的超类型。”
有一个适用于有界通配符类型的助记符:PECS。制作人延伸,消费者超级。比较器始终是其实例的使用者,因此在参数列表中指定它们的正确方法如方法声明中所示。
答案 1 :(得分:0)
你有列表和比较器c,所以为什么不只是:
Collections.max(list, c);
-it将返回List或任何其他Collection中的max元素。
虽然我不明白为什么你想在通用列表中寻找最大值时返回int - 你可能正在寻找它的'索引?