package cn.itcast_01;
import java.util.ArrayList;
import java.util.Iterator;
/*
* ArrayList存儲字符串並遍歷
*
* 我們按照正常的寫法來寫這個程序, 結果確出錯了。
* 爲什麼呢?
* 因爲我們開始存儲的時候,存儲了String和Integer兩種類型的數據。
* 而在遍歷的時候,我們把它們都當作String類型處理的,做了轉換,所以就報錯
*了。
* 但是呢,它在編譯期間卻沒有告訴我們。//其實在Myeclipse中已經告訴你了,黃色警告線就告訴你了,這裏隱含着類型安全問題,爲什麼有警告線,就是爲了告訴你這裏容易出問題
* 所以,我就覺得這個設計的不好。
* 回想一下,我們的數組
* String[] strArray = new String[3];
* strArray[0] = "hello";
* strArray[1] = "world";
* strArray[2] = 10;
* 集合也模仿着數組的這種做法,在創建對象的時候明確元素的數據類型。這樣就不會在有問題了。
* 而這種技術被稱爲:泛型。
*
* 泛型:是一種把類型明確的工作推遲到創建對象或者調用方法的時候纔去明確的特殊的類型。參數化類型,把類型當作參數一樣的傳遞。(也就是說一開始不明確,到創建對象或者調用方法的時候才明確)
* 比如 一開始我不明確什麼類型,但是一造對象ArrayList<String> array = new ArrayList<String>();就要明確,爲什麼呢?因爲集合說了集合可以放任何任意類型,而我知道我的集合放字符串,我就告訴你我放字符串
* 我知道我放學生,我就告訴你ArrayList我放學生 還有就是 只要在API看到這種 Iterator<E>就要明確類型
* 格式:
* <數據類型>
* 此處的數據類型只能是引用類型。
* 好處:
* A:把運行時期的問題提前到了編譯期間
* B:避免了強制類型轉換
* C:優化了程序設計,解決了黃色警告線
*/
public class GenericDemo {
public static void main(String[] args) {
// 創建
ArrayList<String> array = new ArrayList<String>();
// 添加元素
array.add("hello");
array.add("world");
array.add("java");
// array.add(new Integer(100)); Integer是一個引用類型,而add()方法裏面接收的是object類型,引用類型是object類型的一種
//array.add(10); // JDK5以後的自動裝箱,把這個通過反編譯工具,反編譯之後,爲add.(Integer.valueof(10))
// 等價於:array.add(Integer.valueOf(10));
// 遍歷
Iterator<String> it = array.iterator();
while (it.hasNext()) {
// ClassCastException
// String s = (String) it.next();//這裏要把Integer類型轉化爲字符類型,所以要報錯,前三個可以,最後一個要報錯
String s = it.next();
System.out.println(s);
}
// 看下面這個代碼
// String[] strArray = new String[3];
// strArray[0] = "hello";
// strArray[1] = "world";
// strArray[2] = 10;這裏要報錯
}
}