泛型与集合结合是Java标准写法,声明时明确元素类型可实现编译期类型安全、避免强制转换和ClassCastException;如List仅允许添加String,get()直接返回String,增强for遍历时变量即为具体类型。

泛型和集合类的结合不是“高级技巧”,而是 Java 开发中的标准写法——不加泛型的集合,等于裸奔。
必须用泛型声明集合变量
声明时就明确元素类型,编译器立刻帮你拦截错误:
-
List
list = new ArrayList(); —— 只能 add 字符串,get() 直接返回 String,不用强转 -
Set
set = new HashSet(); —— add("abc") 编译失败,避免运行时 ClassCastException -
Map
map = new HashMap(); —— put("u1", new User()) 合法;put(123, "x") 编译报错
遍历时自然获得具体类型
有了泛型,增强 for 和 get() 都省去类型判断和强制转换:
- for (String s : list) { System.out.println(s.length()); } —— s 就是 String,可直接调用 length()
- for (User u : userList) { u.getName(); } —— 不再需要 User u = (User) obj;
- Iterator
it = scores.iterator(); while (it.hasNext()) { Double d = it.next(); }
泛型让集合操作更安全、更简洁
对比没有泛型的写法,差异一目了然:
- 无泛型:List list = new ArrayList(); list.add("a"); list.add(123); —— 编译通过,但取值时极易出错
- 有泛型:List
list = new ArrayList(); list.add("a"); list.add(123); —— 第二行直接编译失败 - 类型擦除不影响安全性:泛型只在编译期起作用,运行时虽被擦除,但所有非法赋值已在编译阶段被拦截
搭配通配符提升灵活性(进阶但实用)
当方法要处理多种泛型集合时,用 ? 避免类型僵化:
-
void printAll(List> list) —— 接收 List
、List 等任意 List -
void addNumbers(List super Integer> list) —— 可向 List
或 List -
Number max(List extends Number> list) —— 可读取 List
、List 中的数字,但不能往里 add(PECS 原则)


















