2013-02-21 26 views
1

我知道泛型,但我不清楚這個語法。例如,在Collections.sort():Java在Collections中的靜態方法需要說明嗎?

public static <T> void sort(List<T> list, Comparator<? super T> c) 

什麼是靜態<T>返回類型爲void前的意義是什麼?

+0

我的問題應該已經明朗,我理解的「靜態」部分的議題是通用。編輯該問題以僅突出顯示通用 Ramp 2013-02-21 16:35:57

回答

3

sort的方法簽名:

public static <T> void sort(List<T> list, Comparator<? super T> c) { 

<T>定義了可以在方法定義中引用的任意通用類型T。

我們現在想說的是,該方法需要某種類型的List(我們不關心它)T和另一種類型的Comparator但這種類型必須是T的超這意味着,我們可以這樣做:

Collections.sort(new ArrayList<String>(), new Comparator<String>()); 
Collections.sort(new ArrayList<Integer>(), new Comparator<Number>()); 

但不是這個

Collections.sort(new ArrayList<String>(), new Comparator<Integer>()); 
+0

當我們說列表和比較儀時,List和它的比較器之間的關係在參數本身中建立。 有什麼問題在上面指定? – Ramp 2013-02-21 17:10:07

+0

沒有。但是你需要在某處聲明'T'。你可以在課程頂部做到這一點,這意味着你到處都有相同的'T',或者你可以在特定的方法基礎上做到這一點 - 就像這裏。 – 2013-02-21 17:27:03

1

您可以按照沒有實例Collectionssort()方法是Collections類的靜態方法。

考慮之間的語法差別:

Collections col = new Collections(); 
col.sort(someCollection); 

Collections.sort(someCollection); 

sort()方法不必依賴於性能的一些可能的集合對象。因此,作爲設計問題,最好聲明爲static方法。

2

返回類型void之前靜態<T>的意義是什麼?

這是一種通用的方法,和<T>是其類型參數。它表示,只要比較器能夠比較此類型或其任何超類型的對象(Comparator<? super T>),就會對包含任何類型對象(List<T>)的列表進行排序。因此,編譯器將允許您撥打sort,例如通過List<Integer>Comparator<Number>(因爲IntegerNumber的子類型),但不是List<Object>Comparator<String>

1

<T>被稱爲其在此處用於在抽象的排序方法正在操作的項目的類型的類型參數。你可以有類或方法的類型參數。這是爲方法指定類型參數的語法,它必須在方法的返回類型之前。