理解:public static <t> int max(List <t> list,Comparator <! - ?super T - > c)</t> </t>

时间:2013-10-21 20:12:39

标签: java generic-method

我应该创建一个返回任何列表最大值的方法,我想这是一个通用的方法。但我不明白参数,有人可以解释一下吗? 我还创建了一个迭代器,我将在解决方案中使用它来运行列表,但是当我创建迭代器的一个实例时,这个方法给了我以下错误:“#nameofclass不能从静态上下文引用”,那么如何在这里制作一个实例? (由于某种原因它应该是静态的)我将不胜感激任何帮助!

public static <T> int maks(List<T> list, Comparator<? super T> c)
  {
    // return max in a list
  }

2 个答案:

答案 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 - 你可能正在寻找它的'索引?