1. 程式人生 > >【學習心得】泛型小結

【學習心得】泛型小結

 

---------------------- android培訓java培訓、期待與您交流! ----------------------

我們知道程式就是演算法和資料的結合,泛型就是將演算法從操作的資料型別中分離出來,在邏輯上把相同的演算法統一,不再和資料型別繫結,這是我的理解。按照書本上專業術語“泛型”來看,“泛型”指的是“引數化的型別”,它的重要的特性是它能讓你建立類,介面和方法,由他們操作的資料型別被指定為一個引數。還要注意的一點是:Java編譯器並不建立不同版本(型別引數)的泛型類,實際上編譯器在同一個泛型類(不同的型別引數)進行編譯時把所有的型別資訊都刪除了,這就是泛型的“去型別化”。知道這點很重要,因為在反射中會有涉及到getParameterTypes() 方法的理解。
   為了瞭解泛型帶來的一些好處,我們來看這樣一部分程式碼NonGen(Object o){
                                                    Object ob=o;
                                                   Object getOb(){
                                                    return ob;}
引數是Object型別的,所以不用說,所有類型別都能傳遞給它。然後我們再呼叫這個方法iob = NonGen(“I love 黑馬”)
                                                                          int V= (Integer)iob.getOb();程式碼在編譯時沒有錯誤,但是在執行時會報錯,這時候的錯誤往往是糟糕的。分析原因:由於NonGen()的引數是Object型別,所以任何物件都可以傳遞給它,但是我們傳遞的是一個String物件,呼叫getOb()後,我們獲得String物件,然後我們將它強制轉換成Integer物件,這是不同的物件,在執行時顯然會出項異常。泛型就很好的解決了這個問題。
   需要我們掌握的是泛型引數的有界限制和使用萬用字元變元。
我們在傳遞引數型別時可能需要對引數型別進行限制,這時我們就使用引數型別的有界限制,一般使用格式為class Gen<T extends superclass & interfaceclass>{//....},T表示只能是同時滿足superclass本身或者其的子類和實現了interfaceclass的介面類,如果界限只包含一個父類或者介面則不需要用“&”。萬用字元變元?是有別於<T>的,我們查詢java的幫助文件會發現,有的<>是“T”,有的是“?”,如果我們在呼叫某個泛型物件的方法時,如果泛型的型別變元和方法的引數都是同一種泛型型別(型別引數決定),那麼型別變元可以是T,也可以是?,但是我們的需求是呼叫物件和方法不相同的泛型引數,則用?。上次看到有同學說<T>,<?>和<Object o>的區別,我的理解是<T>和<?>的區別如前面所說,<?>和<Object o>是一樣的,不知道有沒有錯誤,希望高手看到後能指點一下。此外,萬用字元在涉及到界限問題是和<T>的用法基本一致,只是萬用字元界限有上下界,分別是extends和super,看懂了前面的<T>界限,這裡應該很好懂了,這裡就不多說了,小結完畢。


---------------------- android培訓java培訓、期待與您交流! ---------------------- 詳細請檢視:http://edu.csdn.net/heima