十二章、泛型
12-1 为何要有泛型
1、泛型:是一种标签。把元素的类型设计成一个参数,这个类型参数就叫做泛型
2、所谓泛型,就是允许在定义类、接口时通过一个标识表示类中 某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象)确定(即传入实际的类型参数,也称为类型实参)
package com.java3.kcw;
import org.junit.Test;
import java.util.*;
/**
* @author Jackson_kcw
* @Time 2025-03-02 PM2:36
*/
public class GenericTest {
@Test
public void test() {
//使用泛型时,里面不能用基本数据类型,需要用包装类
ArrayList<Integer> list=new ArrayList<Integer>();
//保证编译时数据的安全
list.add(19);
list.add(20);
list.add(91);
//遍历方式一、
for(Integer i:list){
//避免强转操作
System.out.println(i);
}
//遍历方式二、利用 iterator
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
//在集合中使用泛型,以 HashMap为例
@Test
public void test2() {
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("a",1);
map.put("cc",88);
map.put("jackson",7);
Set<Map.Entry<String,Integer>>entry=map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
while(iterator.hasNext()){
Map.Entry<String, Integer> entry1 = iterator.next();
}
}
}
总结:① 集合接口或集合类在jdk5.0时都修改为带泛型的结构。
② 在实例化集合类时,可以指明具体的泛型类型 ③ 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。比如:add(E e) —>实例化以后:add(Integer e)
④ 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类来替换
如果实例化时,没有指明泛型的类型。默认类型为java.Lang.Object类型。
3、如何自定义泛型结构:泛型类、泛型接口;泛型方法
a.泛型在继承方面的体现
类 A 是类 B 的父类,G和 G 二者不具备子父类关系,二者是并列关系
类 A 是类 B 的父类,A
b.通配符的使用
通配符: ?
类 A 是类 B 的父类,G和 G是没有关系的,二者共同的父类是:G<?>
代码中具体使用:
对于 List<?>就不能向其内部添加数据啦,除了添加 null 之外;允许读取数据,读取的数据类型为 Object