泛型:
泛型是Java 5引入的特性,用来提供类型安全,避免强制类型转换,比如集合框架里的List、Set、Map这些都用到了泛型。比如ArrayList<String>这样,确保只能添加字符串,取出来的时候也不用强转
核心概念
- 类型参数化
泛型允许在类、接口、方法中使用类型参数(如 <T
>),使用时再指定具体类型:
List<String> list = new ArrayList<>();
- 类型安全
编译器在编译时检查类型,避免运行时类型转换错误(如 ClassCastException)。 - 类型擦除
Java 泛型在编译后会擦除类型信息(替换为 Object 或上界类型),运行时无法获取泛型的具体类型。
优点:
日常应用场景:
- 集合框架(Collections)
泛型最典型的应用是集合类,确保集合中元素的类型一致:
List<Integer> numbers = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
- 自定义泛型类/接口
定义可复用的通用组件,例如数据库操作的 Dao:
public interface Dao<T> {
void save(T entity);
T findById(Long id);
}
public static <T> T getFirstElement(List<T> list) {
return list.get(0);
}
public static <T> T[] mergeArrays(T[] arr1, T[] arr2) {
T[] merged = Arrays.copyOf(arr1, arr1.length + arr2.length);
System.arraycopy(arr2, 0, merged, arr1.length, arr2.length);
return merged;
}
- API 响应包装
统一 REST API 响应格式,支持不同类型的数据:
public class Result<T> {
private int code;
private String message;
private T data;
}
Result<User> userResult = new Result<>(200, "OK", user);
Result<List<Product>> productResult = new Result<>(200, "OK", products);
高级特性:
- 类型擦除与补偿
- 泛型信息在编译后被擦除,但可以通过以下方式绕过限制:
public class MyClass<T> {
private Class<T> type;
public MyClass(Class<T> type) {
this.type = type;
}
public T createInstance() throws Exception {
return type.getDeclaredConstructor().newInstance();
}
}
- 泛型与继承
List 不是 List 的子类,但可以通过通配符处理:void processList(List<?> list) { }
注意事项和限制:
- 无法实例化泛型类型
T obj = new T();
- 不能使用基本类型
泛型参数必须是引用类型(如 Integer 而非 int)。 - 数组与泛型
不能直接创建泛型数组(如 new T[]),可通过反射或 ArrayList 替代。 - 类型擦除的影响
运行时无法通过 instanceof 检查泛型类型。
总结
- 泛型的核心价值:
- 类型安全:减少运行时错误。
- 代码复用:编写更通用的逻辑。
- 代码可读性:明确参数和返回值的类型。