泛型类与泛型方法的核心区别在于类型参数绑定时机和作用范围:前者在实例化时确定并影响整个类,后者在每次调用时动态确定且仅作用于该方法。

泛型方法和泛型类的核心区别在于「类型参数的绑定时机」和「作用范围」:泛型类的类型参数在创建实例时确定,影响整个类的行为;泛型方法的类型参数在每次调用时确定,只作用于该方法本身。
泛型类:类型参数随对象生命周期固定
泛型类在定义时声明类型参数(如 <t></t>),必须在实例化时明确指定具体类型,之后该对象中所有使用 T 的地方都锁定为那个类型。
- 例如
new ArrayList<string>()</string>,这个对象只能存String,get()方法永远返回String - 同一个泛型类可以有多个不同类型的实例:
ArrayList<string></string>和ArrayList<integer></integer>是两个独立的类型 - 类中的普通方法(如
public T getData())不是泛型方法,它们只是使用了类已声明的T
泛型方法:类型参数按需动态推断或显式指定
泛型方法在方法签名前单独声明类型参数(如 <t> T convert(...)</t>),每次调用都可以传入不同的类型,与所在类是否泛型无关。
- 即使类本身不是泛型类,也能定义泛型方法;即使类已是泛型类,其内部的泛型方法仍可声明自己的
<k></k>、<v></v>等,与类的T互不干扰 - 调用时可显式指定:
Utils.<string>parse("abc")</string>,也可由编译器自动推断:String s = Utils.parse("abc") - 常见例子:
Collections.<string>singletonList("x")</string>、Arrays.<integer>asList(1,2,3)</integer>
关键约束差异
有些限制只适用于其中一种,容易混淆:
- 静态方法不能使用所在泛型类的类型参数(如
static void foo(T t)❌),但可以定义自己的泛型方法(如static <t> void foo(T t)</t>✅) - 泛型类的类型参数在运行时被擦除,无法通过
instanceof判断;泛型方法同理,但方法内可通过Class<t></t>参数保留类型信息用于反射操作 - 泛型类支持继承和实现(如
class MyList<e> extends ArrayList<e></e></e>),而泛型方法不涉及继承关系
选哪个更合适?看实际需求
如果逻辑需要长期持有某一种类型的数据(如容器、DAO 模板),用泛型类;如果只是某个操作要适配多种类型(如转换、比较、拷贝),用泛型方法更轻量、更灵活。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











