Java泛型
Java泛型(Generics)是Java 5引入的一项重要特性,它允许在定义类、接口或方法时使用类型参数(Type Parameters),从而提高代码的类型安全性和重用性。
1. 泛型的基本概念
- 目的:提供编译时类型检查,避免运行时类型转换错误(如
ClassCastException)。 - 核心思想:参数化类型,即在使用时才指定具体的类型。
2. 泛型类
- 在类名后使用
<T>定义类型参数,T可以是任意标识符(如E、K、V等)。 - 示例:
public class Box<T> { private T content; public void setContent(T content) { this.content = content; } public T getContent() { return content; } } - 使用:
Box<String> stringBox = new Box<>(); stringBox.setContent("Hello");
3. 泛型方法
- 在方法返回类型前定义类型参数,可以独立于类的泛型参数。
- 示例:
public <T> void printArray(T[] array) { for (T item : array) { System.out.println(item); } } - 使用:
Integer[] intArray = {1, 2, 3}; printArray(intArray);
4. 泛型接口
- 类似于泛型类,接口也可以定义类型参数。
- 示例:
public interface List<T> { void add(T item); T get(int index); } - 实现:
public class ArrayList<T> implements List<T> { // 实现方法 }
5. 类型通配符(Wildcards)
- 用于处理未知类型的情况,使用
?表示。 - 上界通配符(
<? extends T>):表示类型是T或其子类。public void process(List<? extends Number> list) { ... } - 下界通配符(
<? super T>):表示类型是T或其父类。public void addNumbers(List<? super Integer> list) { ... }
6. 泛型的限制
- 类型擦除:泛型信息在编译后会被擦除,运行时无法获取泛型的具体类型。
- 不能实例化泛型类型:如
new T()是非法的。 - 不能使用基本类型:如
List<int>是非法的,必须使用包装类List<Integer>。 - 不能创建泛型数组:如
new T[10]是非法的。
7. 泛型与继承
- 泛型类或接口的子类可以指定具体类型或保留泛型参数。
- 示例:
public class StringBox extends Box<String> { ... }
8. 泛型的实际应用
- 集合框架:如
List<T>、Map<K, V>等。 - 工具类:如
Collections中的泛型方法。 - 自定义数据结构:如链表、栈、队列等。
9. 泛型的最佳实践
- 命名规范:使用有意义的类型参数名(如
T表示类型,E表示元素,K表示键,V表示值)。 - 避免原生类型:如
List应改为List<T>。 - 优先使用泛型方法:减少代码重复。
10. 泛型的扩展
- Java 10+的局部变量类型推断:可以使用
var简化泛型声明。var list = new ArrayList<String>();
本文来自博客园,作者:路口偶然遇见你,转载请注明原文链接:https://www.cnblogs.com/wzy/p/19027819

浙公网安备 33010602011771号