public static void printColl(ArrayList<?> al) { Iterator<?> it = al.iterator(); while (it.hasNext()) { System.out.println(it.next().toString()); } }
?和T都表示不確定的類型 但如果是T的話 函數里面可以對T進行操作 比如while里面可以這樣寫
T t = it.next();
System.out.println(t);
T自定義泛型和?通配符泛型
1.在整個類中只有一處使用了泛型,使用時注意加了泛型了參數不能調用與參數類型有關的方法比如“+”,比如打印出任意參數化類型集合中的所有內容,就適合用通配符泛型<?>
public static void printCollecton(Collection<?> collection) { for (Object obj : collection) { System.out.println(obj); } }
2. 當一個類型變臉用來表達兩個參數之間或者參數與返回值之間的關系時,即統一各類型變量在方法簽名的兩處被使用,或者類型變量在方法體代碼中也被使用而不僅 僅在簽名的時候使用,這是應該用自定義泛型<T>。泛型方可以調用一些時間類型的方法。比如集合的add方法。
public static <T> T autoConvertType(T obj) { return (T) obj; }
總結:
泛型三種: ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T類型;T 代表一種類型 ArrayList<?> al=new ArrayList<?>();集合元素可以是任意類型,這種沒有意義,一般是方法中,只是為了說明用法;?是通配符,泛指所有類型 ArrayList<? extends E> al=new ArrayList<? extends E>(); 泛型的限定: ? extends E:接收E類型或者E的子類型。 ?super E:接收E類型或者E的父類型。