Java泛型通过类、接口、方法的类型参数化实现安全复用,支持类型约束与推断,避免类型擦除隐患,并借助通配符增强兼容性。

Java 中通过泛型类、泛型接口和泛型方法,把类型当作参数来处理,让同一套逻辑适配多种数据类型,不用为 String、Integer、User 各写一遍类似代码。核心不是“多写”,而是“写一次,安全复用”。
泛型类:定义可承载任意类型的容器或模型
在类名后加 <T>(或其他有意义的标记符),T 就能在成员变量、方法参数和返回值中直接使用。
- 声明时用占位符,比如
class Box<T>,T 可以是任何引用类型(不能是int,但可用Integer) - 使用时指定具体类型:
Box<String> stringBox = new Box<>("hello");,编译器会自动检查后续操作是否符合String - 避免类型擦除带来的隐患:未加泛型的
List允许混入不同对象,而List<Double>在编译期就拒绝add("abc")
泛型接口:约束实现类的行为并保留类型灵活性
接口也能参数化,常见于框架设计或通用契约场景,比如 Comparable<T> 或自定义的数据访问规范。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义形式:
interface Repository<T> { T findById(Long id); void save(T entity); } - 实现类可固定类型:
class UserDao implements Repository<User>,所有方法都按User处理 - 也可继续泛型化:
class GenericDao<T> implements Repository<T>,保持开放性,便于统一封装
泛型方法:局部需要类型灵活,不牵连整个类
当某个方法逻辑通用,但涉及的类型和所在类无关时,就单独给方法加泛型——在返回类型前声明 <T>。
立即学习“Java免费学习笔记(深入)”;
- 典型写法:
public static <T> void printArray(T[] arr),调用时可传String[]或Integer[],无需重载 - 支持类型推断:写
Util.printArray(new String[]{"a","b"}),编译器自动识别为printArray<String> - 注意区分:泛型类里的普通方法(如
Box.getContent())不是泛型方法;只有带<T>声明的才是
配合通配符增强兼容性
光靠 T 有时不够灵活,比如想接收任意类型的集合做只读遍历,这时用 ? 或有界通配符更稳妥。
-
void process(List<?> list):接受任意List,但不能往里 add(安全协变) -
double sum(List<? extends Number> numbers):只收Number及其子类(Integer、Double等),可安全调用doubleValue() - 避免生造
new T():类型擦除后无法获取运行时 Class,需额外传入Class<T>参数辅助构造

















