java泛型在类声明中通过尖括号定义类型参数,是编译期类型契约而非运行时配置;语法要求类型参数紧随类名后、位于继承/实现前;类型参数不可为基本类型、不可实例化,需用extends限定边界;实例化时须传入具体类型实参以启用类型检查。

Java 中泛型在类声明中配置未知类型参数,核心是用尖括号
泛型类声明的基本语法
必须把类型参数写在类名后面、继承/实现关键字之前,格式固定:
-
正确写法:
class Box<t> { ... }</t>或class Pair<k v> { ... }</k> -
错误写法:
class Box extends Object<t></t>(语法非法)、class Box<t> implements List<t> { ... }</t></t>(位置错,应紧贴类名) - 类型参数名常用单字母:T(Type)、E(Element)、K/V(Key/Value)、N(Number)等,但可自定义,如
class Result<data></data>
类型参数的约束与限制
泛型参数不能是基本类型,也不能被直接实例化,但可通过限定边界增强安全性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
extends设上限:例如class Container<t extends comparable>></t>表示 T 必须实现 Comparable 接口 - 不能写
new T(),因为类型擦除后无具体类信息;可用工厂方法或 Class参数绕过 - 静态字段或方法不能直接引用 T,比如
private static T cache;编译报错 - 数组创建受限:不能
new T[10],但可(T[]) new Object[10](需加 @SuppressWarnings("unchecked"))
泛型类如何使用和实例化
声明只是第一步,真正使用时需传入具体类型实参,此时泛型才“落地”:
- 实例化对象:
Box<string> stringBox = new Box();</string>、Pair<integer string> pair = new Pair(100, "ok");</integer> - 方法中可安全使用泛型字段:
public void set(T item) { this.value = item; },调用时自动检查类型 - 子类继承时可选择固化类型(
class StringBox extends Box<string></string>)或继续泛型化(class NamedBox<t> extends Box<t></t></t>)
常见误区提醒
泛型是编译期特性,运行时不存在 —— 所以没有“动态配置泛型类型”的操作:
- 不能通过配置文件、反射或运行时字符串决定
是什么;类型实参必须在代码中明确写出或由上下文推断 - 不要试图把泛型当成“参数配置项”,它本质是让编译器帮你做类型检查的工具
- 未指定泛型(如
ArrayList list = new ArrayList();)会退化为原始类型,失去类型安全
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










