1. 程式人生 > >02. 程式設計核心內功心法之泛型

02. 程式設計核心內功心法之泛型

# 泛型 ```java public static void main(String[] args) { //List list = new ArrayList(); //指定能夠存放的資料型別,統一型別防止出現 型別轉換異常 List list = new ArrayList(); list.add(1); list.add("hello"); list.add(new Object()); for (Object obj:list) { System.out.println((String)obj); //java.lang.ClassCastException } } ``` > 本質:引數化型別 **泛型的擦除** > 泛型只在編譯階段有效,編譯之後JVM會採取去泛型化的措施. > > 泛型在執行階段是沒有效果 ```java public static void main(String[] args) throws Exception { List list = new ArrayList(); list.add("1"); list.add("hello"); list.add("2"); for (Object obj:list) { System.out.println((String)obj); } //反射賦值 Class aClass = list.getClass(); Method method = aClass.getDeclaredMethod("add", Object.class); method.invoke(list,new Object()); System.out.println(list);//沒有任何問題 } ``` ## 一、泛型萬用字元介紹 ### 1、無邊界萬用字元 ```java public static void main(String[] args) { List list1 = new ArrayList<>(); list1.add("gupao"); list1.add("bobo"); list1.add("mic"); loop(list1); } /** * < ? > 通用的型別可以是任意型別 */ public static void loop(List list){ for (int i = 0; i < list.size() ; i++) { System.out.println(list.get(i)); } } ``` ### 2、上邊界萬用字元 ```java public static void main(String[] args) { List list1 = new ArrayList<>(); list1.add("gupao"); list1.add("bobo"); list1.add("mic"); // loop(list1); List list2 = new ArrayList<>(); list2.add(1); list2.add(2); list2.add(3); } /** * < ? extends Number > * 通用的型別必須是Number及其子類 * @param list */ public static void loop(List list){ for (int i = 0; i < list.size() ; i++) { System.out.println(list.get(i)); } } ``` ### 3、下邊界萬用字元 ```java public static void main(String[] args) { List list1 = new ArrayList<>(); list1.add("gupao"); list1.add("bobo"); list1.add("mic"); loop(list1); List list2 = new ArrayList<>(); list2.add(1); list2.add(2); list2.add(3); loop(list2); } /** * < ? super Number > * 通用型別必須是Number 到Object型別的物件 * @param list */ public static void loop(List list){ for (int i = 0; i < list.size() ; i++) { System.out.println(list.get(i)); } } ``` ## 二、泛型的具體使用 > 規則: 必須先宣告再使用 > > 1、泛型的宣告是通過"<>"實現 > > 2、約定泛型可以使用單個大寫字母來表示 K E T V 等 ```java /** * 泛型沒有宣告就直接使用了 * @param t * @return */ public T func(T t){ return null; } ``` ### 1、泛型類 ```java public class Fun { private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } public Fun(T t) { this.t = t; } } //PersonBean public class PersonBean { private int id; private String name; private String password; //get/set } //測試 public static void main(String[] args) { PersonBean bean = new PersonBean(); bean.setId(1); bean.setName("Andy"); bean.setPassword("12345"); Fun pn = new Fun(bean); //PersonBean Fun s = new Fun("hello"); //String } ``` > 增加了程式碼的靈活度 ### 2、泛型方法 ```java public class Fun { //普通方法 可以使用 類中定義的泛型 public K method1(K k,V v){ return (K)null; } //普通方法 使用方法中定義的泛型 public T method2(T t,V v){ return (T)null; } //在靜態方法中我們沒法使用 類中定義的泛型,想使用需自己定義 public static K method3(){ return null; } } ``` ### 3、泛型介面 ```java public interface CalGeneric { T add(T a,T b); T sub(T a,T b); T mul(T a,T b); T div(T a,T b); } //實現類 - Integer public class CalIntegerGeneric implements CalGeneric { @Override public Integer add(Integer a, Integer b) { return null; } @Override public Integer sub(Integer a, Integer b) { return null; } @Override public Integer mul(Integer a, Integer b) { return null; } @Override public Integer div(Integer a, Integer b) { return null; } } //實現類 - Double public class CalDoubleGeneric implements CalGeneric{ @Override public Double add(Double a, Double b) { return null; } @Override public Double sub(Double a, Double b) { return null; } @Override public Double mul(Double a, Double b) { return null; } @Override public Double div(Double a, Double b) { return null;