泛型是将“类型”作为参数传递,如ArrayList在编译期确保类型安全;Box中T为类型占位符,实例化时替换为具体类型;泛型仅限引用类型,运行时被擦除。

零基础搞懂Java泛型的基本语法,关键不是死记符号,而是抓住一个核心:泛型是把“类型”当成参数来用。就像方法接收int、String这些值参数,泛型让类、接口、方法也能接收“String”“Integer”这样的类型参数,从而在编译期就管住数据类型。
从最常用的集合入手,看懂尖括号怎么用
你每天写的 ArrayList 就是最直观的泛型用法:
-
不是注释,是传给ArrayList的“类型实参”,告诉它:这个集合只存String,取出来也直接是String,不用强转 - 写成
ArrayList,逻辑完全一样,只是类型换成了Integer - 如果漏掉泛型(比如只写
ArrayList),编译器就当它是“原始类型”,失去类型检查,退回到 Java 5 之前那种容易出错的状态
动手写一个泛型类,理解 T 是什么
别被 T 吓到——它就是个占位符,代表“等你用的时候再填的具体类型”:
- 定义:
class Box{ private T content; public void set(T c) { content = c; } public T get() { return content; } } - 使用:
Box——这里box = new Box(); box.set("abc"); String s = box.get(); T就被替换成String - 再用一次:
Box——同一个dBox = new Box(); dBox.set(3.14); Double d = dBox.get(); Box类,T变成Double
区分泛型类、泛型方法和泛型接口
它们都用 ,但位置和作用范围不同:
-
泛型类:整个类都带类型参数,比如
Box,里面所有用到T的地方都统一替换 -
泛型方法:只在某个方法上声明,比如
public,void print(E[] arr) E只在这个方法里有效,类本身可以不是泛型的 -
泛型接口:类似泛型类,比如
interface Generator,实现类必须指定具体类型,如{ T next(); } class RandomIntGen implements Generator
记住几个实用细节,避免踩坑
刚学时容易卡在这几个点上:
- 类型参数不能是基本类型(如
int、char),只能用包装类(Integer、Character) - 创建对象时,右边的
可以省略(叫菱形运算符),编译器能自动推断,比如new ArrayList可简写为() new ArrayList() - 泛型只在编译期起作用,运行时会被擦除(即
ArrayList和ArrayList运行时都是ArrayList),所以不能用if (list instanceof ArrayList这种写法)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











