泛型是把類型做爲一種參數來指定,使用泛型以後類型就不是一成不變的了 ,而是經過參數來進行設定。泛型能夠是系統JAVA中的 類 ,也能夠是本身建立的類, 另外還有泛型通配符,無限定的通配符? 或者是 上限通配符 ?extends T , 或者是 下限通配符 ?super T 。 上限表明最高繼承與T 類型 ,下限表明最低是T類型 或是T的 父類 。如下 介紹幾種泛型的使用例子。 `java
import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; //泛型的通配符問題 public class Ex_21 { // 演示1:泛型參數不會主動考慮繼承關係 public void test() { List<B> listB = new ArrayList<B>(); List<C> listC = new ArrayList<C>(); List<A> listA = new ArrayList<A>(); // 遍歷輸出B print_1(listB); print_1(listA); print_1(listC); // print_2(listB); // print_2(listA); // print_2(listC); } //輸出 public void print_1(Collection<?> c) { for (Object obj : c) { System.out.println(obj); } } //輸出方法 public void print_2(Collection<Object> c){ for(Object obj: c){ System.out.println(obj); } } /* * 總結 :明顯 第二種會報錯, Object 其父類 可是 泛型 不會主動考慮繼承關係 * */ //演示2: 通配符 上界 public void test2(){ List<? extends A> listA = new ArrayList<A>(); // listA.add(new A()); //假如想加入 A的類型 和A的子類怎麼辦? //以下處理就能夠 List<A> list = new ArrayList<A>(); list.add(new A()); list.add(new B()); list.add(new C()); //沒法使用 帶有泛型通配符的引用調用 泛型的方法 } //演示3: 自定義泛型方法 這個比較經常使用 泛型方法 能夠接受 不一樣類型參數 實現相同功能 ; public static <T>T getLast(T[] a){ return a[a.length-1] ; } public void test3(){ String [] str = {"100","200","300"}; Integer [] in = {400,500,600}; Ex_21.<String> getLast(str); Ex_21.<Integer> getLast(in); } //演示4: 實現指定類型 ,容器類型 public void test4(){ M_value <Integer> m = new M_value<Integer>(); m.setValue(100); Integer i = m.getValue(); System.out.println(i); } //該類封裝了數據, 數據 繼承了Number 而且實現了Serialziable 和 Comparable 接口 class M_value <M extends Number & Serializable & Comparable>{ private M value; public M getValue(){ return value; } public void setValue(M value){ this.value = value; } }`