泛型概述
- 引入背景:Java泛型在JDK 5中引入,目的是增强类型系统和表达能力。
- 主要优势:
- 类型安全:编译时类型检查,避免运行时错误。
- 消除强制类型转换:简化代码,提高可读性。
- 提高代码重用性:创建通用代码,适应不同场景。
- 性能提升:减少自动装箱拆箱操作。
泛型基础
- 泛型定义:允许类型作为参数传递给类、接口、方法。
- 泛型类:类名后跟类型参数,如
ServerResponse<T>
。 - 泛型接口:接口名后跟类型参数,实现时需指定或继承泛型。
- 泛型方法:方法级别定义类型参数,提高代码通用性。
泛型作用域
- 泛型类作用域:类成员使用,不适用于静态成员。
- 泛型接口作用域:接口方法实现必须遵循泛型定义。
- 泛型方法作用域:仅限于方法内使用。
泛型通配符与类型擦除
- 边界约束:
- 上界:
<T extends 上界类>
,限制泛型必须是上界类或其子类。 - 下界:
<? super 下界类>
,限制泛型必须是下界类或其超类。
- 上界:
- 无界通配符:
<?>
,代表不确定类型,用于类型未知或不关心具体类型的场景。 - 类型擦除:运行时泛型信息被移除,使用Object替代。
泛型使用细节与问题
- 可变形参:
<T> void print(T... params)
,接受任意数量参数。 - 基础类型限制:泛型不支持基础数据类型,必须使用包装类。
- 方法重载限制:多泛型参数无法实现方法重载。
- 泛型继承性:泛型类型不具有继承性,避免类型安全性问题。
- 实例化限制:无法直接基于泛型创建具体对象或数组。
- 类型获取限制:无法直接获取泛型的Class对象,需通过数据或构造器传递。
泛型实战
- Bean拷贝工具类:
copy(Object source, Class<T> clazz)
:拷贝单个Bean对象。copyList(List<T> sourceList, Class<T> clazz)
:拷贝Bean对象集合。
泛型机制总结
- 重要性:泛型增强了Java语言的能力,提高了代码的安全性、灵活性和复用性。
- 应用场景:泛型在Java 8等新特性中有广泛应用,需要在实践中不断探索。