为什么要有泛型

  1. 解决元素存储的安全性问题,好比商品、药品标签,不会弄错。
  2. 解决获取数据元素时,需要类型强制转换的问题,好比不用每回拿商品、药品都要辨别。
  • 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。
  • Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。

在集合中使用泛型

package top.triabin._02genericinset;

import org.junit.Test;

import java.util.*;

/**
* 泛型的使用
* 1.jdk 5.0新增特性
* 2.在集合中使用泛型:
* 总结:①集合接口或集合类在jdk5.0都修改为带泛型的结构;
* ②在实例化集合类时,可以指明泛型类型;
* ③指明后,在集合或接口中凡是定义类或接口时,内部结构使用到类的泛型的位置,都指定为实例化时指定的泛型类型。
* 比如:add(E e) ==>实例化以后:add(Integer e)
* ④注意:泛型的类型必需是类,不能是基本数据类型。基本数据类型用相对应的包装类替换。
* ⑤如果实例化时没有指明泛型类型,默认为java.lang.Object类型。
*
* @author DawnLee
* @create 2020-11-17 11:47
*/
public class GenericTest {
//在集合中使用泛型之前的情况:
@Test
public void test1(){
ArrayList list = new ArrayList();//存放学生成绩
list.add(78);
list.add(89);
list.add(90);
list.add(86);
//问题一:;类型不安全
// list.add("Tom");

for(Object score : list){
//问题二:强转时,可能会出现类型异常ClassCastException
int stuScore = (Integer)score;
System.out.println(stuScore);
}
}

//在集合中使用泛型的情况:
@Test
public void test2(){
ArrayList<Integer> list = new ArrayList<Integer>();//存放学生成绩
list.add(78);
list.add(89);
list.add(90);
list.add(86);
//编译时,就会进行类型检查,保证数据安全
// list.add("Tom");

//方式一:
// for(Integer score : list){
// //避免了强转操作
// int stuScore = score;
// System.out.println(stuScore);
// }

//方式二:Iterator
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}

//在集合中使用泛型的情况:以HashMap为例
@Test
public void test3(){
// Map<String,Integer> map = new HashMap<String,Integer>();
//jdk新特性:类型推断
Map<String,Integer> map = new HashMap<>();

map.put("Tom",87);
map.put("Jerry",90);
map.put("Jack",66);

// map.put(123,"ABC");
//泛型嵌套
Set<Map.Entry<String, Integer>> entry = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
while(iterator.hasNext()){
Map.Entry<String, Integer> e = iterator.next();
String key = e.getKey();
Integer value = e.getValue();
System.out.println(key + "-->" + value);
}
}
}

自定义泛型结构

泛型在继承上的体现

通配符的使用

泛型应用举例

课后练习与面试题