文章目錄
一、泛型的由來
1、Collection的缺陷
2、泛型的由來背景
二、泛型的好處
1、類型安全
2、消除強制類型轉化
三、泛型的格式
1、爲什麼泛型使用<>
2、泛型格式
四、泛型的簡單使用
一、泛型的由來
1、Collection的缺陷
Java語言的集合有一個缺點:當我們把一個對象丟進集合後,集合就會忘記這個對象的數據類型,當再次取出該對象時,該對象的編譯類型就變成了Object類型(其運行時類型沒變)。
2、泛型的由來背景
如果能向我們定義數組一樣,在定義的時候就能明確指定元素類型,例如ArrayList<String>
,這說明此ArrayList只能保存字符串對象。Java的這種參數化類型被稱爲泛型。
JDK1.5版本後出現的新特性,用於解決安全問題,是一個安全機制。
二、泛型的好處
1、類型安全
將運行時期出現的ClassCastException轉移到編譯時期,方便程序員解決問題,讓運行問題減少,安全。
2、消除強制類型轉化
避免了強制轉換的麻煩。這使得代碼更加可讀,並且減少了出錯機會。儘管減少了強制類型轉換可以降低使用泛型類代碼的複雜度,但是聲明泛型變量會帶來相應的複雜度。
三、泛型的格式
1、爲什麼泛型使用<>
{}被程序結構使用,()被參數使用, [] 被數組使用,就剩<>了。
2、泛型格式
通過<>來定義要操作的引用數據類型(類類型,接口類型,數組除外)。通常在集合中很常見,當使用集合時,將集合中要存儲的數據類型作爲參數傳遞要<>中即可。其實<>就是用來接收類型的。從JDK1.5後,你可以爲任何類或者接口增加泛型聲明。
四、泛型的簡單使用
1、簡單例子演示ClassCastException
我們都知道集合可以裝任意對象。並用迭代器去訪問集合中的對象。
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add(2); // list.add(new Integer(2)); JDK1.5後會自動裝箱
Iterator it = list.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str+":"+str.length());
}
}
運行結果
1:1
2:1
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.lemon.GenericTest.main(GenericTest.java:14)
分析:
當用迭代器訪問到對象2的時候,強轉出現類型錯誤。注意:這個是在運行期間。我們可以想象,當我們將程序打包給用戶的時候,用戶處於運行階段,那是不是就造成程序終止運行。我們希望能在編輯的階段就能都把這些問題解決掉。問題的產生,就是因爲我們往集合中存了不同類型的對象。
於是乎我們將程序修改如下:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add(2); // list.add(new Integer(2));
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = it.next();
System.out.println(str+":"+str.length());
}
}
繼續編譯我們的程序(編譯失敗,程序由運行時期出現問題轉移到編譯時期,方便程序員解決問題,讓運行時期問題減少),終端命令行:javac GenericDemo.java
繼續修改如下:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
Iterator<String> it = list.iterator(); //迭代器聲明類型,使用next便不需要強轉!!!
while(it.hasNext()){
String str = it.next();
System.out.println(str+":"+str.length());
}
}
依然是命令行,javac GenericDemo.java,發現筆譯通過,並且下面的警告也一併消除了
2、泛型的基本使用
當我們在看API文檔的時候會發現,有些泛型用,而有些用,其實這個T和E只是個形式參數。你可以這麼理解,T=type,E=Elements 。
( 1 ) 定義泛型接口:比較器ComatorJDK 1.5 後改寫了集合框架中的接口和類接口,併爲這些接口和類增加了泛型支持。