类型形参是泛型定义时声明的占位符(如<T>),仅编译期存在;类型实参是使用泛型时传入的具体引用类型(如String);二者结合形成参数化类型(如Box<String>),实现编译期类型安全。

类型形参(Type Parameter)是泛型定义时的“占位符”,类型实参(Type Argument)是使用泛型时填进去的“具体类型”。关键不在名字,而在出现位置和作用阶段。
类型形参:定义泛型时声明的变量名
它出现在类、接口或方法的声明中,用尖括号包裹,比如 <T>、<K, V>。T 和 K、V 本身不是真实类型,只是命名约定的符号,代表“将来会传一个类型进来”。
- 只在编译期起作用,运行时被擦除(type erasure)
- 命名习惯常用单个大写字母:T(Type)、E(Element)、K(Key)、V(Value)、N(Number)等
- 不能是基本类型,如
Box<int>是非法的,必须写Box<Integer> - 示例:
class Box<T> { private T value; }中的 T 就是类型形参
类型实参:实例化泛型时传入的具体类型
它出现在泛型被使用的场合,即创建对象、调用方法或声明变量时,尖括号里填的实际引用类型。
- 必须是具体的引用类型(如
String、List<Integer>、自定义类),不能是基本类型或类型形参本身 - 决定该泛型实例的行为边界,比如
Box<String>只能存字符串,Box<Double>只能存浮点数 - 示例:
Box<String> box = new Box<>();中的 String 就是类型实参 - 编译器可推断时可省略(如
new Box<>()),但语义上仍存在类型实参
参数化类型(Parameterized Type):二者结合后的完整形态
当类型实参代入类型形参后,就构成一个参数化类型——这才是真正参与编译检查和类型安全的实体。
立即学习“Java免费学习笔记(深入)”;
- 例如:
Box<String>、Map<Integer, List<Boolean>>都是参数化类型 - 它不是“新类型”,而是泛型类型(如
Box<T>)的一个具体应用实例 - 与之相对的是原始类型(Raw Type),如直接写
Box(不带尖括号),会失去泛型检查,仅用于兼容旧代码
类比普通方法的形参与实参,更容易理解
可以把泛型看作“类型层面的函数”:
-
类型形参 ≈ 方法形参:定义时写的
void print(T data)中的T -
类型实参 ≈ 方法实参:调用时写的
print("hello")中的"hello"对应的类型String -
参数化类型 ≈ 方法调用结果:就像
print("hello")是一次具体执行,Box<String>是一次具体类型绑定


















