开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情
集合中使用泛型
-
集合接口或集合类在JDK5.0时都修改为带泛型的结构
-
在实例化集合类时,可以指明具体的泛型类型
-
泛型的类型不能是基本数据类型
-
如果实例化时,没有指定泛型的类型,默认类型为Object
泛型类
-
泛型不同的引用不能相互赋值
-
静态成员中不能使用类的泛型
-
异常类不能声明为泛型类
-
使用泛型的数组不能初始化
-
不能使用
new E[],编译时会把E当成一个类,同理不能new E -
解决:
E[] elements = (E[]) new Object[capacity] -
参考:ArrayList源码中声明:
Object[] elementData,而非泛型数组
-
-
父类有泛型,子类可以选择指定或保留全部泛型也可以增加自己的泛型
-
类A是类B的父类,但是 G<A> 和 G<B>二者不具备继承关系,二者是并列关系,共同父类是G<?>
- 类A是类B的父类,A<G> 是 B<G> 的父类
泛型方法
- 在方法中出现泛型的结构,与所属类是不是泛型类没有关系。格式如下:
[访问权限] <泛型> 返回类型 方法名( [泛型标识 参数名称 ] )
-
不加 <泛型> 的话编译器会把泛型标识当成一个类
-
泛型方法可以声明为静态的。原因:泛型参数是在调用方法时确定的,并非在实例化类。
通配符
使用类型通配符:?
-
比如:List<?>,Map<?,?>。List<?>是List<String>、List<Object>等各种泛型List的父类。
-
对于List<?>,不能向其内部添加数据,除了null
-
对于List<?>,允许获取数据,获取的数据类型为Object
限制条件:
以下添加和读取了解即可(正常人谁会拿list<? super B>添加读取啊),通过多态进行理解,实际开发中会给通配符泛型赋值具体的类,限制通配符只是做一个约束。
-
<? extends A>: 支持A类以及A类的子类,相当于 (-∞,A] ,规定了泛型的上限
-
以
list<? extends A>为例 -
添加:不能向其内部添加数据。原因:不能添加泛型的父类。
在此区间取一点永远有人比你小。
-
读取:获取的数据类型为A
-
-
<? super B>: 支持B类以及B类的父类,相当于 [B,+∞) ,规定了泛型的下限
- 以
list<? super B>为例 - 添加:可以添加B和B的子类
- 读取:获取的数据类型为Object
- 以