泛型
一、为什么要有泛型?
1.1 泛型
可以理解为生活中的标签
把元素的类型设计成一个参数
,这个参数就是泛型
所谓泛型,就是允许在定义类、接口时通过一个标识符表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)
1.2 问题一——类型不安全
public void test(){
ArrayList list = new ArrayList();
//需求存放学生成绩
list.add(78);
list.add(45);
list.add(97);
list.add(46);
list.add(54);
//问题一:类型不安全
list.add("Tom");
for(Object obj : list){
System.out.println(obj);
}
}
输出:
78
45
97
46
54
Tom
说明:可以看见,在添加数据的时候,可能会误放其他类型的元素,此时没有使用泛型,不仅在编译的时候不会报错,在允许的时候也不会报错
1.2 问题二——强转时可能出现报错
出现java.lang.ClassCastException
报错信息
for(Object obj : list){
//问题二:强转时,可能出现ClassCastException
int score = (int) obj;
System.out.println(score);
}
输出:
78
45
97
46
54
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
1.3 引出泛型
上述代码之所以没有达到我么的预期效果,是因为在添加数据时,错误地添加了不安全数据,
由此我们想避免当前list混入其他类型的变量,
我们就需要在添加时,进行**类型检查**,即在集合中使用**泛型**。
二、在集合中使用泛型
在集合中使用泛型以后,如果不小心添加了错误数据,编译不通过
2.1 在ArrayList中使用泛型
//在集合中使用泛型的情况
@Test
public void test2(){
ArrayList<Integer> list = new ArrayList<>();
list.add(98);
list.add(67);
list.add(54);
list.add(23);
//编译时就会进行类型检查,保证数据的安全
//list.add("String");
//遍历方式一:
for (Integer i : list){
//避免了强转操作
int score = i;
System.out.println(score);
}
//遍历方式二:
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
int score = iterator.next();
System.out.println(score);
}
}
输出:
98
67
54
23
98
67
54
23
2.2 在HashMap中使用泛型
//在HashMap中使用泛型
@Test
public void test3(){
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("AA",1);
map.put("DA",342);
map.put("DS",432);
map.put("CC",556);
map.put("BB",8)