下面的程序在編譯階段不會發現錯誤, 可是在運行時會出現錯誤java
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
List array_list = new ArrayList(); array_list.add("aaaa"); array_list.add(100); for (int i = 0; i < array_list.size(); i++) { String item = (String)array_list.get(i); Log.d("泛型測試", "item=" + item) }
咱們要讓程序在編譯階段就能夠發現這個錯誤, 程序能夠改寫成app
List<String> array_list = new ArrayList<String>(); array_list.add("aaaa"); array_list.add(100); for (int i = 0; i < array_list.size(); i++) { String item = (String)array_list.get(i); Log.d("泛型測試", "item=" + item) }
這樣上面的程序就會在編譯階段就發現錯誤, 避免產生bug。dom
泛型的特性ide
List<String> string_array_list = new ArrayList<String>(); List<Integer> integer_array_list = new ArrayList<Integer>(); Class class_string_array_list = string_array_list.getClass(); Calss class_integer_array_list = integer_array_list.getClass(); if (class_string_array_list.equals(class_integer_array_list)) { Log.d("泛型測試", "輸出結果爲類型相同") }
泛型類型在邏輯上看以當作是多個不一樣的類型,實際上都是相同的基本類型。測試
# 一個普通的泛型類 //此處T能夠隨便寫爲任意標識,常見的如T、E、K、V等形式的參數經常使用於表示泛型 //在實例化泛型類時,必須指定T的具體類型 public class Generic<T> { //key這個成員變量的類型爲T,T的類型由外部指定 private T key; //泛型構造方法形參key的類型也爲T,T的類型由外部指定 public Generic(T key) { this.key = key; } //泛型方法getKey的返回值類型爲T,T的類型由外部指定 public T getKey() { return this.key; } } // 實例化上面的類 // 整型 Generic<Integer> generic_integer = new Generic<Integer>(12345); Log.d("泛型測試", "key is " + generic_integer.getKey()); // 字符型 Generic<String> generic_string = new Generic<String>("hello"); Log.d("泛型測試", "key is " + generic_string.getKey()); Generic generic = new Generic("111111"); Generic generic1 = new Generic(4444); Generic generic2 = new Generic(55.55); Generic generic3 = new Generic(false); Log.d("泛型測試","key is " + generic.getKey()); Log.d("泛型測試","key is " + generic1.getKey()); Log.d("泛型測試","key is " + generic2.getKey()); Log.d("泛型測試","key is " + generic3.getKey()); D/泛型測試: key is 111111 D/泛型測試: key is 4444 D/泛型測試: key is 55.55 D/泛型測試: key is false
# 定義一個泛型接口 public interface Generator<T> { public T next(); } /** * 未傳入泛型實參時,與泛型類的定義相同,在聲明類的時候,需將泛型的聲明也一塊兒加到類中 * 即:class FruitGenerator<T> implements Generator<T>{ * 若是不聲明泛型,如:class FruitGenerator implements Generator<T>,編譯器會報錯:"Unknown class" */ class FruitGenerator<T> implements Generator<T>{ @Override public T next() { return null; } } public class FruitGenerator implements Generator<String> { private String[] fruits = new String[]{"apple", "banana", "pear"}; @Override public String next() { Random random = new Random(); return fruits[random.nextInt(3)]; } }