ClassCaseException:類型轉換異常。程序員
代碼中不加泛型,編譯沒問題,運行可能會發生異常。可是用戶解決不了,這樣程序就存在安全隱患。因此咱們但願在編譯時期就能看出問題,程序員解決看後到運行時期就沒有問題了。安全
問題產生的緣由:往集合裏面存了不一樣元素形成的。框架
泛型:JDK1.5版本之後出現新特性,用於解決安全問題,是一個類型安全機制。對象
好處:接口
1,將運行時期出現問題ClassCastException,轉移到了編譯時期,方便於程序員解決問題。讓運行事情問題減小,安全。io
2,避免了強制轉換麻煩。編譯
泛型格式:經過<>來定義要操做的引用數據類型。ast
在使用Java提供的對象時,何時寫泛型呢?一般在集合框架中很常見,只要見到<>就要定義泛型。其實<>就是用來接收類型的。泛型
當使用集合時,將集合中要存儲的數據類型做爲參數傳遞到尖括號中便可。擴展
何時定義泛型類?
當類中要操做的引用數據類型不肯定時,早期定義Object來完成擴展,如今定義泛型類完成擴展。
泛型定義在類上:泛型類定義的泛型,在整個類中有效,若是被方法使用,那麼泛型類的對象明確要操做的具體類型後,全部要操做的類型就已經固定了。
泛型定義在方法上:爲了讓不一樣的方法能夠操做不一樣類型,並且類型還不肯定,那麼能夠將類型定義在方法上。
注意泛型定義在方法上,是放在返回值類型的前面,修飾符的後面。
注意特殊之處:靜態方法不能夠訪問類上定義的泛型。若是靜態方法操做的引用數據類型不明確,能夠將泛型定義在方法上。(靜態泛型不能隨着類的泛型走)
泛型定義在接口上。見到帶泛型的內容的時候,用的時候往裏面傳參數。這個應用通常很少見,是Java定義好就直接拿來用。
當咱們建立兩個操做不一樣類型的集合時,不須要寫兩個迭代器。
「?」:通配符。也能夠理解爲佔位符。
泛型的限定:是用於泛型擴展用的。
1,? extends E: 能夠接收E類型或者E的子類型。(上限)
2,? super E : 能夠接收E類型或者E的父類型。(下限)
。。。