一、泛型的概述
泛型的格式:
<具体的数据类型>
使用格式:
ArrayList<限定集合中的数据类型> list = new ArrayList<限定集合中的数据类型>();
说明:给集合加泛型,就是让集合中只能保存具体的某一种数据类型。
说明:由于创建ArrayList集合的时候就已经限定集合中只能保存String类型的数据,所以编译的时候保存其他的数据类型就会报错,
这样就达到了我们上述保存数据的目的了。
二、泛型的好处
- 将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
- 避免了类型强转的麻烦。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
public
class
GenericDemo2 {
public
static
void
main(String[] args) {
Collection<String> list =
new
ArrayList<String>();
list.add(
"abc"
);
list.add(
"itcast"
);
// list.add(5);//当集合明确类型后,存放类型不一致就会编译报错
// 集合已经明确具体存放的元素类型,那么在使用迭代器的时候,迭代器也同样会知道具体遍历元素类型
Iterator<String> it = list.iterator();
while
(it.hasNext()){
String str = it.next();
//当使用Iterator<String>控制元素类型后,就不需要强转了。获取到的元素直接就是String类型
System.out.println(str.length());
}
}
}
|
注意:泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。
三、泛型的注意事项
- 泛型只支持引用数据类型(类类型或接口类型等),泛型不支持基本数据类型:
ArrayList<int> list = new ArrayList<int>();//错误的
- 泛型不支持数据类型以继承的形式存在,要求前后泛型的数据类型必须一致:
ArrayList<Object> list = new ArrayList<String>();//错误的
- 在jdk1.7之后,泛型也可以支持如下写法:
ArrayList<String> list = new ArrayList<>();//正确的
注意:现在的开发中,泛型已经成为编写代码的规范。
四、自定义泛型
在集合中,不管是接口还是类,它们在定义的时候类或接口名的后面都使用<标识符>,当我们在使用的时候,可以指定其中的类型。
如果当前的类或接口中并没有<标识符>,我们在使用的时候也不能去指定类型。
举例:比如我们之前所学习的集合ArrayList类:
new ArrayList<E>
说明:在ArrayList类上有一个泛型的参数:E
- 泛型自定义格式:
<标识符>
这里的标识符可以是任意的字母、数字、下划线和 $ 。但是这里一般规范使用单个大写字母。
五、受限泛型
设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限和下限。
泛型的上限:
- 格式: 类型名称 <? extends 类 > 对象名称
例如:? extends Person :?代表的是一种类型,当前这个类型可以是Person本身,也可以是Person的子类。
- 意义: 只能接收该类型及其子类
泛型的下限:
- 格式: 类型名称 <? super 类 > 对象名称
例如: ? super Student :?代表当前的类型可以是Student类型,也可以是Student的父类类型。
- 意义: 只能接收该类型及其父类型
更多Java学习资料可关注:gzitcast