通配符是什么
<?>
指的是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对象里