2014-10-09 35 views
0

我有一個方法簽名,通過值對給定的地圖進行排序。我的方法簽名中稱爲什麼是這些東西?泛型?

public static <K extends Comparable<K>, V extends Comparable<V>> Map<K,V> sortByValues(Map<K,V> map){ 

我想了解這個方法簽名中的東西的術語。我得到了public,static,Map<K,V>,函數名和參數部分。

我的困惑是在<K extends Comparable<K>, V extends Comparable<V>>部分。它的目的是定義什麼KV是在方法的上下文中,是正確的?描述這個的恰當術語是什麼?

任何關於泛型的推薦讀物或文章?

+0

它們是['界類型parameters'](http://docs.oracle.com/javase/tutorial/java/generics /bounded.html)。 – 2014-10-09 03:34:41

+1

和一般[Java泛型教程](http://docs.oracle.com/javase/tutorial/java/generics/why.html) – aruisdante 2014-10-09 03:35:21

+0

@ PM77-1泛型之外是否使用了有界類型參數? – user2859406 2014-10-09 03:37:46

回答

0

是的,KV這裏是通用的type parameters。更具體地說,@aruisdante在評論中指出,它們是有界的類型參數,因爲它們指定了參數化類型必須滿足的界限 - 即它們都必須實現Comparable。

看來你的問題是關於一般的參數,但不是專門針對有界參數。你絕對應該做一些閱讀你自己,因爲你問a big (and important) topic,但我會在介紹它採取了刺:

您可能熟悉不同的上下文中看到類型參數 - Map<String, Integer>:這裏<String, Integer>也是類型參數,它們指定該映射中的鍵是String s,其中的值是Integer s。在方法聲明的上下文中,類型參數指定返回類型是什麼。這意味着你可以寫generic methods每一個他們所謂的時間返回不同的類型,這取決於你在什麼傳:

注意,KV是兩個方法本身和傳入的參數類型參數:這告訴Java通過查看傳入的映射的鍵和值類型來確定KV,並返回具有相同類型的映射。如果您致電sortByValue(fooMap)fooMapMap<String, FooType>,則它將返回一個地圖<String, FooType>,並且如果fooMapMap<Integer, BarType>,則會返回Map<Integer, BarType>

更清晰的例子,考慮:

public <T> foobar(T t) { } 

這裏的類型參數是無限的 - 這意味着T可以是任何類,所以你可以作爲參數傳遞任何類的對象,並得到一個對象返回相同的類型。或

public<T> convertTo(Object o, Class<T> clazz) { } 

在這裏,你可以通過任何類作爲第一個參數的對象,並作爲第二個參數Class對象,決定了T會。所以你可以這樣做:

Fooclass s = convertTo(someObject, Fooclass.class) 

其中,你可能會想象,可以是一個非常有用的模式。

0

它們的參數化類型實例根據JLS Chapter 4. Types, Values, and Variables它說部分地與一個或多個類型的參數A1

泛型類或接口聲明C(§8.1.2§9.1.2),... ,具有相應邊界B1,...,Bn的An定義了一組參數化類型,對於每個可能的類型參數部分的調用都有一個參數化類型。

集合中的每個參數化類型的形式都是C,其中每個類型參數Ti覆蓋所有類型,它們是相應邊界中列出的所有類型的子類型。也就是說,對於Bi中每種結合類型的Si,Ti是Si [F1:= T1,...,Fn:= Tn]的子類型。

...

給出一個類型聲明符緊跟一個類型參數列表,令C在符最終標識符。

0

我看到泛型的方式與我看到的類相同,只能用於類型和方法。他們概括了方法和數據結構,以本地支持所有有界類型。

而不是用相同的方法一遍又一遍地編碼同一個對象,它說:「好吧,無論你在< >會告訴我什麼課程,我都會明白。

假設你想要寫在未知對象的數組的二進制搜索...你可以寫以下特徵:

public boolean binarySearch(Object[] array)... 

但是如果你想要的方法來通過只有某些類型的訪問數據(可彼此比較的類型)?這是你將如何實現這一目標:

public <T extends Comparable<T>> boolean binarySearch(T[] array)... 

這是讀這樣的:「這是隻接收包含對象數組的公共方法(我們會打電話給他們T)的實現Comparable接口相同的類(T)。

不僅類可以在泛型被延長,但接口以及(就像上面的例子)。

對於數據結構等

Vector<Integer> v; 

這意味着矢量v將只保存Integer對象而不保存其他類型。

通配符有邊界的物體,例如同樣的原則:

Vector<? extends Person> v; 

即矢量V將舉辦唯一的類人超一流的人。

Vector<?> v; 

大致相當於此

Vector<Object> v; 
相關問題