泛型
-
所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类 型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如, 继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实 际的类型参数,也称为类型实参)。
-
从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念, 允许我们在创建集合时再指定集合元素的类型,正如:List,这表明 该List只能保存字符串类型的对象。
JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持, 从而可以在声明集合变量、创建集合对象时传入类型实参。
在集合中使用泛型:
- 集合接口或集合类在JDK 5.0时都修改为带泛型的结构。
- 在实例化集合类时,可以指明具体的泛型类型。
- 指明完以后,在集合类或接口中凡是定义类或接口时,内部机构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型的类型。
比如:add(E e)
→实例化以后:
add(Integer e)
- 注意点:泛型的类型必须时类,不能是基本数据类型。需要用到基本数据类型时,可以使用包装类替换。
- 如果实例化时,没有指明泛型的类型。默认类型为
java.lang.Object类型
。
在集合中使用泛型之前的情况(以ArrayList为例)
public void test() {ArrayList list = new ArrayList();// 要求:存放数字list.add(123);list.add(456);list.add(848);list.add(-485);// 问题一:类型不安全list.add(\"Tom\");for (Object score : list) {// 问题二:强转时,可能出现ClassCastException异常int stuScore = (Integer) score;System.out.println(stuScore);}}
在集合中使用泛型的情况(以ArrayList为例)
public void test2() {ArrayList<Integer> list = new ArrayList<Integer>();// JDK 7新特性:类型推断// ArrayList<Integer> list = new ArrayList<>();list.add(85);list.add(75);list.add(15);list.add(-87);// 编译时,就会进行检查,保证数据的安全//list.add(\"Tom\");// 方式一for (Integer score : list) {// 避免了强转操作int stuScore = score;System.out.println(stuScore);}// 方式二Iterator<Integer> iterator = list.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}
在集合中使用泛型的情况(以HashMap为例)
public void test3() {HashMap<String, Integer> map = new HashMap<String, Integer>();// JDK 7新特性:类型推断HashMap<String, Integer> map = new HashMap<>();map.put(\"Tom\",87);map.put(\"Jerry\",65);map.put(\"Mack\",87);// map.put(125,\"ABC\");// 泛型的嵌套Set<Map.Entry<String,Integer>> entry = map.entrySet();Iterator<Map.Entry<String,Integer>> iterator = entry.iterator();ad8while (iterator.hasNext()) {Map.Entry<String,Integer> e = iterator.next();String key = e.getKey();Integer value = e.getValue();System.out.println(key + \"-----\" + value);}}