通配符是什么
<?>
指的是Object及其子類,也就是所有Java對象
泛型是什么
<E>:Element (容器中的元素,如集合)<T>:Type(Java 類)<K>:Key(鍵)<V>:Value(值)<N>:Number(數值類型)<S>、<U>、<A>、<B>….
聲明泛型
<T>
聲明一個泛型類或者泛型方法
示例:
使用泛型
<?>
使用一個泛型類或者泛型方法
示例:
1 public static ResultDTO<?> entity(int code,Object... data) { 2 ResultEnum resultEnum = ResultEnum.getEnum(code); 3 if(0==data.length) { 4 return new ResultDTO<ResultEnum>(resultEnum); 5 }else{ 6 return new ResultDTO<Object>(resultEnum,data); 7 } 8 }
通配符之邊界
為什么通配符要加邊界
為了解決容器中存儲的元素不能是該基類(父類)的子類。
上界通配符
關鍵字:extends
禁止做插入操作,只做讀取
最大只能是該基類(父類)的子類
下界通配符
關鍵字:super
最小只能是該子類,不能是該類的子類
無法確定存入類型,可以插入操作,而無法讀取操作Apple 繼承 Fruit,Fruit 繼承 Food
1 public static ResultDTO<? super Fruit> entity(int code,Object... data) { 2 ResultEnum resultEnum = ResultEnum.getEnum(code); 3 if(0==data.length) { 4 return new ResultDTO<Food>(resultEnum); 5 }if(1==data.length) { 6 return new ResultDTO<Fruit>(resultEnum); 7 }else{ 8 return new ResultDTO<Apple>(resultEnum,data);//報錯 9 } 10 }
報錯
Type mismatch: cannot convert from ResultDTO<Apple> to ResultDTO<? super Fruit>
PECS原則
Producer Extends Consumer Super原則
extends推薦讀操作super推薦寫操作
注
- 聲明泛型不能用無邊界通配符
<?> - 上界<? extends T>不能往里存,只能往外取
- 下界<? super T>不影響往里存,但往外取只能放在Object對象里
