2013-10-21 25 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,可能是您正在查找其索引?