泛型类编写需在类名后用尖括号声明类型参数(如t、e、k/v),并在字段、方法等处使用;实例化时须填入具体类型,java需显式指定(如box)、ts在变量声明时标注、kotlin可推导,且泛型为编译期特性,运行时擦除。

泛型类的编写与实例化,核心在于“定义时留白、使用时填实”——类中用类型参数(如 T)占位,创建对象时再指定具体类型(如 String 或 Number),从而兼顾复用性与类型安全。
怎么编写泛型类
在类名后用尖括号声明一个或多个类型参数,之后可在字段、方法参数、返回值、局部变量中直接使用该参数:
- Java 示例:public class Box
{ private T content; public void setContent(T content) { this.content = content; } public T getContent() { return content; } } - TypeScript 示例:class Pair
{ constructor(public key: K, public value: V) {} } - Kotlin 示例:class Container
(val data: T)
注意:类型参数命名习惯上用单个大写字母,如 T(Type)、E(Element)、K/V(Key/Value)。
怎么实例化泛型类
实例化即“填入具体类型”,不同语言语法略有差异,但逻辑一致:
-
Java:必须显式指定类型,支持菱形运算符简化写法
Boxbox1 = new Box();
Boxbox2 = new Box (); -
TypeScript:类型只存在于编译期,实例化不带类型参数,但声明变量时需注明具体泛型类型
const pair: Pair= new Pair("age", 25); -
Kotlin:类型推导能力强,常可省略右侧类型声明
val container = Container("hello") 或 val container: Container= Container("hello")
⚠️ 特别提醒:Java 中若省略泛型类型(如 new Box()),会触发原始类型(raw type),失去类型检查,不推荐。
常见误区与注意事项
- 泛型是编译期特性,运行时通常不存在(如 Java 的类型擦除),所以不能通过 new T[] 创建泛型数组,也不能在运行时反射获取 T 的真实类对象。
- 静态成员无法直接使用类的泛型参数(如 Java 中 static T value 是非法的),因为静态属于类本身,而泛型类型属于实例化后的类型。
- TypeScript 中泛型类本身不是类型,Foo 和 Foo
是完全不同的类型;若需将泛型类当作构造器类型传递,需用类型断言或继承方式“固定”类型参数。











