運維自動化釋出系統
阿新 • • 發佈:2020-10-22
泛型是一種未知的資料型別,不清楚使用什麼型別的資料時可以使用泛型;
也可以看成一個變數,用來接收資料
例如ArrayList<E>其中的E就是一個泛型
建立集合物件的時候會確定泛型的資料型別
public static void method1(){ /* 不使用泛型 好處:集合不使用泛型,預設型別是Object類的,可以接收任意資料型別 缺點:不安全,會引發異常(ClassCastException); */ ArrayList list01= new ArrayList<>(); list01.add("123"); list01.add(1); Iterator<Object> it = list01.iterator(); while(it.hasNext()){ Object obj = it.next(); System.out.println(obj); //遍歷集合 //想要獲取字串的長度 //這是一個多型,應先向下轉型 String s = (String) obj; System.out.println(s.length());//會出現ClassCastException,1 不是String型別 } } 使用泛型 好處:1.避免了型別轉換麻煩,儲存的是什麼型別,取出的是什麼型別; 2.把執行期間的異常(執行後丟擲的異常)提升到了編譯期(寫程式碼的時候報錯); 缺點:儲存資料型別單一 */
public class DefineClass<E> { //在建立物件時確定泛型的型別 private int num ; //也可以有確定的型別,與普通類一樣 privateE str; public int getNum() { return num; } public void setNum(int num) { this.num = num; } public E getStr() { return str; } public void setStr(E str) { this.str = str; } //定義一個含有泛型的方法 public static <E> int method(E e,E e1){ System.out.print("傳遞的是:"+e+"e1 "+e1); return 1; } //在呼叫方法是確定泛型的型別(傳遞的是什麼型別,泛型就是什麼型別); public <E> int method1(E e,E e1){ //非靜態方法不會隨物件的型別走,同樣在呼叫方法的時候確定泛型的型別 System.out.print("傳遞的是:"+e+"e1 "+e1); return 1; } }
public interface DefineInterface<E> { public abstract void method02(E e); }
public class DefinrInterfaceImpl1<E> implements DefineInterface<E> { //在實現時確定介面的泛型型別 @Override public void method02(E integer) { System.out.print("======="); } }
public class Test { public static void main(String[] args) { DefinrInterfaceImpl1 impl1 = new DefinrInterfaceImpl1(); impl1.method02(2); DefinrInterfaceImpl1<Integer > impl2 = new DefinrInterfaceImpl1<>(); impl1.method02(22); //介面使用什麼泛型,實現類就用什麼泛型,建立物件時確定泛型型別 //帶有泛型的類 DefineClass test = new DefineClass(); test.setStr(2222); } }
泛型統配符
/* 泛型萬用字元<?> 不確定用什麼資料型別,可以使用萬用字元;
只能又來接收資料,不能儲存資料
不能建立物件使用,只能作為方法引數使用
例子:遍歷集合 */
public static void printArray(ArrayList<?> list){ Iterator<?> it = list.iterator(); while(it.hasNext()){ Object obj = it.next();//只有Object類可以接收任意型別 System.out.println(obj); } }
統配符的高階使用---受限泛型
泛型的上限限定: ? extends E ; 代表泛型只能是E型別的子類或者本身;
? super E ;代表泛型只能是E型別的父類或者本身;