淺談Java中的泛型
阿新 • • 發佈:2019-01-29
編寫 eric ria getc variable ner strong 集合類 類繼承
泛型是Java自JDK5開始支持的新特性,主要用來保證類型安全。另外泛型也讓代碼含義更加明確清晰,增加了代碼的可讀性。
- 泛型的聲明和使用
在類聲明時在類名後面聲明泛型,比如MyList<T>,其中T就是泛型,相當於一個類型變量,表示MyList類期望操作的類型。
public class MyList<T> { public void add(T t) { } }
當定義MyList變量、創建MyList對象、聲明MyList子類時就可以為泛型T指定具體類型
public static void main(String[] args) { MyList<String> myList = new MyList<String>(); myList.add("只能傳入字符串"); }
其實泛型在Java集合框架中使用的非常廣泛,集合類的絕大部分操作都使用了泛型,由於泛型是JDK5時出現的,為了兼容舊版本,以下寫法也能編譯通過,至於是否有泛型效果則取決於變量是否有泛型
List<Integer> list = new ArrayList<Integer>(); //標準寫法 List<Integer> list1 = new ArrayList<>(); List<Integer> list2 = newArrayList(); List list3 = new ArrayList<Integer>(); //無泛型效果 List list4 = new ArrayList(); //無泛型效果
- 泛型察除
Java語言對泛型的實現有些蹩腳,雖然泛型變量的名稱和子類繼承父類時為泛型指定的具體類型可以通過反射拿到,但聲明變量和創建對象時的泛型信息卻被擦除了。
獲得泛型變量的名稱:T
public class MyList<T> { public void getType() { TypeVariable[] type = MyList.class.getTypeParameters(); System.out.println(type[0]);//T } }
獲得子類繼承父類時為泛型指定的具體類型(這點對編寫通用類特別重要):
public class MyList<T> { public void getType() { ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); Class tClass = (Class) type.getActualTypeArguments()[0]; System.out.println(tClass);//class java.lang.String } }
public class MyChild extends MyList<String> { public static void main(String[] args) { MyChild child = new MyChild(); child.getType(); } }
淺談Java中的泛型