泛型,就是參數化類型。提到參數,最熟悉的就是定義方法時候的形參,而後調用此方法時傳遞實參。顧名思義,就是將類型由原來的具體的類型參數化,相似於方法中的變量參數,此時類型也定義爲參數形式(能夠稱之爲類型參數),而後在使用/調用時傳入具體的類型(類型實參)。數組
泛型的本質是爲了參數化類型(再不建立新的類型的狀況下,經過泛型指定的不一樣的類型來控制形參具體限制的類型)。也就是說在泛型使用過程當中,操做的數據類型被指定爲一個參數,這種參數能夠用在類、接口和方法中,分別稱之爲泛型類、泛型接口和泛型方法。ui
泛型只在編譯階段有效,在編譯以後程序會採起去泛型化的措施,也就是說Java中的泛型只在編譯階段有效,在編譯過程當中,正確檢驗泛型結果後會將泛型的相關信息擦除,而且在對象進入和離開方法的邊界處添加類型檢驗和類型轉換的方法,也就是說類型信息不會進入到運行階段。spa
泛型的使用有三種方式:泛型類、泛型接口、泛型方法3d
泛型類型用於類的定義中,被稱爲泛型類。經過泛型能夠完成對一組類的操做對外開放的是相同的接口。code
具體的應用實例:對象
特別說明:定義的泛型類,並不必定要傳入泛型類型實參。在使用泛型的時候若是傳入的是泛型實參,則會根據傳入的泛型實參做相應的限制,此時泛型纔會起到本應起到的限制做用;若是不傳入泛型類型實參的話,在泛型類中使用泛型的方法或者成員變量定義的類型能夠是任何類型;泛型的類型參數只能是類類型,不能是簡單類型。不能對確切的泛型類型使用instanceOf操做,不然編譯器會報錯。blog
泛型接口與泛型類的定義以及使用基本是相同的,泛型接口常被用在各類類的生產器中。接口
1、泛型接口的基本用法(定義一個泛型接口):編譯器
2、當實現泛型接口的類,未傳入泛型實參時:it
當實現泛型接口的類沒有傳入泛型實參的狀況時,與泛型類的定義相同,在聲明類時須要將泛型的聲明也一塊兒加到類中。即:class FruitGenerator<T> implements Generator<T>{};
3、當實現泛型接口的類傳入泛型實參的時候:
至關於定義了一個生產器實現這個接口,雖然咱們只建立了一個泛型接口,可是由於泛型接口中參數類型是不肯定的,因此能夠造成無數種類型的Generator接口。在實現泛型接口的實現類中,若是傳入了泛型實參,那麼在這個類中全部使用該泛型類型的地方都要替換成成傳入的實參類型。
注意:同一種泛型能夠對應多個版本(由於參數類型是不肯定的),可是不一樣的泛型參數的泛型實例之間是不兼容的。
泛型類實在實例化類的時候指明泛型的具體類型;泛型方法實在調用方法的時候指明泛型的具體類型。
說明:
泛型方法中一個比較特殊的狀況就是泛型方法出如今泛型類中
注意:show_1只是一個普通的方法,只是這個方法存在於泛型類裏邊,
但它所包含的參數T是和泛型類中的T一致的;show_3,show_2這兩個方法是泛型類裏的泛型方法,他們所含的泛型方法是一個全新的類型,能夠和泛型類中聲明的T同樣,也能夠 不同。class GenerateTest<T>這是一個泛型類,那麼在裏邊包含的三個方法其中
泛型方法的總結:泛型方法能使方法獨立於類而產生變化,一個基本的原則就是:不管什麼時候,就應該儘可能使用泛型方法 。
Ø 爲泛型添加上邊界,便是傳入的類型實參必須是指定類型的子類型
Ø 在泛型方法中添加上下邊界限制的時候,必須在權限說明與返回值之間的<T>之間添加上下邊界,便是在泛型聲明的時候添加。泛型的上下邊界添加,必須與泛型的聲明在一塊兒
不能建立一個確切的泛型類型的數組,而使用通配符建立泛型數組是能夠的。