Java 泛型基礎

文章目錄
    一、泛型的由來
    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 ) 定義泛型接口:比較器Comator在這裏插入圖片描述JDK 1.5 後改寫了集合框架中的接口和類接口,併爲這些接口和類增加了泛型支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章