1. 程式人生 > 程式設計 >java7 簡化變參方法呼叫例項方法

java7 簡化變參方法呼叫例項方法

這是所有修改裡最簡單的一個,只是去掉了方法簽名中同時出現變參和泛型時才會出現的型別警告資訊。

換句話說,除非你寫程式碼時習慣使用型別為T的不定數量引數,並且要用它們建立集合,否則你就可以進入下一節了。如果你想要寫下面這種程式碼,那就繼續閱讀本節:

public static <T> Collection<T> doSomething(T... entries) {
 ...
}

還在?很好。這到底是怎麼回事?

變參方法是指引數列表末尾是數量不定但型別相同的引數方法。但你可能還不知道變參方法是如何實現的。基本上,所有出現在末尾的變參都會被放到一個數組中(由編譯器自動建立),並作為一個引數傳入。

這是個好主意,但是存在一個公認的Java泛型缺陷——不允許建立已知型別的泛型陣列。比如下面這段程式碼,編譯就無法通過:

HashMap<String,String>[] arrayHm = new HashMap<>[2]; 

不可以建立特定泛型的陣列,只能這樣寫:

HashMap<String,String>[] warnHm = new HashMap[2];

可這樣編譯器會給出一個只能忽略的警告。你可以將warnHm的型別定義為HashMap<String,String>陣列,但不能建立這個型別的例項,所以你不得不硬著頭皮(或至少忘掉警告)硬生生地把原始型別(HashMap陣列)的例項塞給warnHm。

這兩個特性(編譯時生成陣列的變參方法和已知泛型陣列不能是可例項化型別)碰到一起時,會令人有點頭疼。看看下面這段程式碼:

HashMap<String,String> hm1 = new HashMap<>();
HashMap<String,String> hm2 = new HashMap
Collection<HashMap<String,String>> coll = doSomething(hm1,hm2);

編譯器會嘗試建立一個包含hm1和hm2的陣列,但這種型別的陣列應該是被嚴格禁止使用的。面對這種進退兩難的局面,編譯器只好違心地建立一個本來不應出現的泛型陣列例項,但它又覺得自己不能保持沉默,所以還得嘟囔著警告你這是“未經檢查或不安全的操作”。

從型別系統的角度看,這非常合理。但可憐的開發人員本想使用一個十分靠譜的API,一看到這些嚇人的警告,卻得不到任何解釋,不免會內心忐忑。

以上就是本次介紹的全部知識點內容,希望我們整理的內容能夠幫助到大家。