2.23学习总结
学习总结
深入学习 Java 语言
接续之前泛型知识点,学习了泛型类、泛型方法、通配符上下限以及类型擦除底层原理,动手编写测试代码巩固语法;
1.泛型 Generic
1.1 核心作用
解决集合存放任意类型对象,取出强制类型转换容易报错的问题,在编译期约束数据类型,做类型校验。
没有泛型时代码问题:
ArrayList list = new ArrayList(); list.add("hello"); list.add(123); // 取出强转极易ClassCastException Integer num = (Integer) list.get(0);
1.2 泛型基本语法
<数据类型>,只能写引用类型,不能直接写基本数据类型(int→Integer,double→Double)
1)集合使用泛型
// 只允许存String类型 ArrayList<String> list = new ArrayList<>(); list.add("Java"); // list.add(100); 编译直接报错,类型不匹配
String s = list.get(0); // 无需强转
菱形语法 <>
Java7 之后右边可以不写类型,直接空菱形:new ArrayList<>()
2.自定义泛型类
格式:
class 类名<泛型标识> {
成员变量、方法使用这个标识代表类型
}
常用标识约定(只是代号,随便写):
T:Type 任意类型
E:Element 集合元素
K/V:Key/Value 键值对
示例:通用容器类
// T代表不确定的类型,创建对象时指定 public class Box<T> { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } }
调用:
// 指定存字符串 Box<String> strBox = new Box<>(); strBox.setData("泛型测试"); // 指定存整数 Box<Integer> intBox = new Box<>(); intBox.setData(666);
3.泛型方法
方法级别单独定义泛型,优先级高于类上的泛型
public class GenericDemo { // <T> 声明泛型,返回值、参数都可用T public <T> void show(T t) { System.out.println(t); } // 带返回值泛型方法 public <T> T getObj(T t) { return t; } }
调用自动推导类型:
GenericDemo demo = new GenericDemo();
demo.show("abc");
demo.show(99);
4.泛型通配符?
4.1 无界通配符 ?
代表任意未知类型,一般用于参数接收任意泛型集合,不能添加元素,只能获取
// 可以接收 ArrayList<String>、ArrayList<Integer> 等 public void printList(ArrayList<?> list) { for (Object obj : list) { System.out.println(obj); } }
4.2上限通配符 ? extends 类
限定只能是该类及其子类
例:? extends Number → Integer、Double、Long、Byte 都可以
ArrayList<? extends Number> list;
list = new ArrayList
list = new ArrayList
4.3 下限通配符 ? super 类
限定只能是该类及其父类
例:? super Integer → Integer、Number、Object
5.泛型两个关键注意点
泛型只在编译期有效,运行时被擦除(类型擦除)
JVM 字节码中没有泛型信息,本质还是 Object,所以不能用泛型创建数组、不能 new T ()。
泛型不支持多态直接赋值
ArrayList

浙公网安备 33010602011771号