1.泛型:參數化類型,即將類型由原來的具體的類型參數化,相似於方法中的變量參數,此時類型也定義成參數形式(類型形參),在使用/調用時傳入具體的類型(類型實參)。 可使返回結果不用強制轉換java
2.進一步理解:泛型類型在邏輯上看以當作是多個不一樣的類型,實際上都是相同的基本類型。json
在使用泛型類時,雖然傳入了不一樣的泛型實參,但並無真正意義上生成不一樣的類型,傳入不一樣泛型實參的泛型類在內存上只有一個,即仍是原來的最基本的類型(本實例中爲Box),固然,在邏輯上咱們能夠理解成多個不一樣的泛型類型。數組
究其緣由,在於Java中的泛型這一律念提出的目的,致使其只是做用於代碼編譯階段,在編譯過程當中,對於正確檢驗泛型結果後,會將泛型的相關信息擦出,也就是說,成功編譯事後的class文件中是不包含任何泛型信息的。泛型信息不會進入到運行時階段。ide
3.分類: 泛型接口 泛型類 泛型方法this
泛型接口/泛型類:在接口或類裏使用泛型,得在接口名或類名後面加上<T>spa
1 class Box<T> { 2 3 private T data; 4 5 public Box() { 6 7 } 8 9 public Box(T data) { 10 this.data = data; 11 } 12 13 public T getData() { 14 return data; 15 } 16 17 }
泛型方法:前提是此方法所在的類/接口沒有使用泛型,在方法中使用泛型,得在返回類型前加<T>code
json與pojo轉化的實例,使用了com.ibm.juno包。對象
1 public class JSONUtil { 2 3 /** 4 * convert List<Map<String, String>>, POJO to JSON 5 * @param <T> 6 * 7 * @param <T> 8 * @param t 9 * @return 10 * @throws SerializeException 11 */ 12 public static <T> String objectToJSON(T t) { 13 try { 14 return JsonSerializer.DEFAULT.serialize(t); 15 } catch (SerializeException e) { 16 e.printStackTrace(); 17 return null; 18 } 19 } 20 21 public static <T> T jsonToObject(String json, Class<T> clazz) { 22 23 JsonParser jparser = new JsonParser(); 24 try { 25 return jparser.parse(json, clazz); 26 } catch (ParseException e) { 27 e.printStackTrace(); 28 return null; 29 } 30 } 31 }
4.Class<T> T blog
private T product;接口
private Class<T> product;
單獨的T表明一個類型 而 Class<T>表明這個類型所對應的類
public T find(Class<T> clazz, int id);
根據類來反射生成一個實例,而單獨用T無法作到。
使用 ? 代替具體的類型實參。注意了,此處是類型實參,而不是類型形參!且Box<?>在邏輯上是Box<Integer>、Box<Number>...等全部Box<具體類型實參>的父類。由此,咱們依然能夠定義泛型方法,來完成此類需求。
1 public class Box<T> { 2 private T data; 3 4 public Box() { 5 6 } 7 8 public Box(T data) { 9 setData(data); 10 } 11 12 public T getData() { 13 return data; 14 } 15 16 public void setData(T data) { 17 this.data = data; 18 } 19 20 }
1 public class GenericTest { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 Box<String> name = new Box<String>("corn"); 9 Box<Integer> age = new Box<Integer>(712); 10 Box<Number> number = new Box<Number>(314); 11 12 getData(name); 13 getData(age); 14 getData(number); 15 16 getData_1(name); 17 getData_1(age); 18 getData_1(number); 19 20 getData_2(name); 21 getData_2(age); 22 getData_2(number); 23 } 24 25 public static <T> void getData(Box<T> data) { 26 System.out.println("data :" + data.getData()); 27 } 28 29 public static void getData_1(Box<?> data) { 30 System.out.println("data :" + data.getData()); 31 } 32 33 public static <T> void getData_2(Box<?> data) { 34 System.out.println("data :" + data.getData()); 35 } 36 37 }
第二段代碼中的三個泛型方法的寫法軍師正確的,可是隻有後面兩個是使用的通配符,只有使用通配符的纔可使用類型通配符上限,類型通配符下限
6.類型通配符上限和類型通配符下限
上限:Box<? extends Number>
下限:Box<? super Number>
7.泛型用的最多的是在集合中。
8.java中沒有泛型數組一說