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