List<String> list = new ArrayList<String>();
第一次看到這行代碼是一頭霧水,查了好久才弄清楚這是什麼東西,怎麼用。
示例1:
public class GenericTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("qqyumidi");
list.add("corn");
list.add(100);
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i); //需要進行String進行強轉
System.out.println("name:" + name);
}
}
}
在這段代碼中,定義了一列表對象list,並在其中添加了兩個字符串和一個整形數據,在遍歷此列表讀取數據時,則需要首先將此列表轉型爲字符串型才能夠輸出(紅色代碼),而且,我們也不知道此列表是什麼類型的,這就造成了一些不必要的麻煩,而泛型就可以很好的解決這些問題。
示例2:
public class GenericTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("qqyumidi");
list.add("corn");
//list.add(100); //此處會報錯,原因是在定義列表對象時就已經聲明瞭這是一個字符串類型的列表,所以不可以在裏面添加整形的數據
for (int i = 0; i < list.size(); i++) {
String name = list.get(i); //無需進行字符串強轉,前面對列表已經泛型定義成String了。
System.out.println("name:" + name);
}
}
}
上面這段代碼用泛型改寫(藍色代碼表示泛型寫法),其中表示此列表是字符串型,因此,在循環中紅色代碼處,不需要再對列表進行強制轉型。這就是泛型。
同理,類似的方法也可以應用到類和方法中,如下代碼所示:
示例3:
public class GenericTest {
public static void main(String[] args) {
Box<String> name = new Box<String>("corn");
System.out.println("name:" + name.getData());
}
}
class Box<T> {
private T data;
public Box(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
其中,類Box定義時在其旁邊加了,T表示此類的數據類型,T的作用相當於方法中的形參,等待被調用時輸入實參。
在main函數中,將Sting類型傳入形參,此時,Box類就是String型。