2013-10-21 28 views
0

我应该做一个方法,返回任何列表的最大值,我想这是一个通用的方法。但我不明白的参数,任何人都可以请解释我? 另外我做了一个迭代器,我将在解决方案中使用该列表,但是当我制作一个迭代器的实例时,此方法会给我出现以下错误:“#nameofclass不能从静态上下文中引用”,然后我如何在这里创建实例? (由于某种原因,它应该是静态的),我将不胜感激任何帮助!了解:public static <T> int max(列表<T>列表,比较者<? super T> c)请

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

你不明白该声明的哪一部分? –

+0

''在返回类型'int'之前是一个类型参数声明。使用这些关键字进行一些研究。 –

+0

我不明白的参数,首先是一个通用列表,我很好,但那又如何? – comodeque

回答

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将有类型列表中的第一个参数。由于T是方法声明中列出的泛型方法类型参数,因此可以设想它将替换传递给方法的实际类型参数,例如。List<String> list.

第二个参数有点复杂。它是一个有界通配符类型参数。 ?的语义是“任何类型”,super的语义是“任何类是相同类或超类”。因此,第二个参数读作“与传递给方法的实际类型参数T相同类型或超类型的任何类型”。

有一个适用于有界通配符类型的助记符:PECS。生产者延伸,消费者超级。比较器始终是它们实例的消费者,所以在参数列表中指定它们的正确方法如方法声明中所示。

0

你必须列出清单和比较器C,那么,为什么不只是:

Collections.max(list, c); 

- 它会在一个列表或任何其他集合返回最大元素。

虽然我不明白为什么要在通用列表中查找最大值时返回int,可能是您正在查找其索引?