Java 泛型怎么用
你有没有过这样的经历:明明写了一段“通用代码”,却在运行时因为参数类型不对,突然弹出一个类型转换错误,整个程序直接“罢工”?比如你想写一个既能存书本、又能存手机的“收纳盒”,结果拿出来的时候,不小心把书本当成手机用,直接导致程序崩溃。其实这背后,就是泛型在解决的问题——让代码的“通用性”和“安全性”能同时兼顾。
什么是泛型?就是给代码装个“万能标签”
泛型说穿了,就是给类、方法或者接口加上一个“类型标签”,就像你给收纳盒贴个“装书本”“装零食”的标签一样。以前我们想做通用收纳,可能只能用 Object 类型,就像一个没有标签的空盒子,什么都能塞,但拿出来的时候得自己判断是什么东西,一不留神就拿错。

举个生活化的例子:你开了个小杂货铺,想做个“通用货架”,既能放零食、又能放文具。不用泛型的话,你可能会写个货架,能放任意东西,但是每次拿商品都得自己回忆“上次放的是零食还是文具”,很容易搞错。用了泛型,你就可以给货架贴个标签,比如“货架<零食>”,这个货架就只能放零食,拿出来的也肯定是零食,不用再猜。
用泛型写“安全的通用代码”,从一个简单的例子开始
假设你想做一个“储物筐”,能装任何类型的东西,以前的写法可能是这样:
`java
// 不用泛型的储物筐
public class ObjectBasket {
private Object item;
public void setItem(Object item) { this.item = item; }
public Object getItem() { return item; }
}
`
用的时候你得这么写:
`java
ObjectBasket basket = new ObjectBasket();
basket.setItem("矿泉水"); // 放进去字符串
String drink = (String) basket.getItem(); // 取出来强制转成字符串
`
要是你不小心写成了:
`java
basket.setItem(10); // 放进去数字
String drink = (String) basket.getItem(); // 运行时直接报错
`
这就是没有泛型的问题——你得自己保证类型转换不出错,稍不注意就踩坑。
用泛型改造一下,就变成了这样:
`java
// 用泛型的储物筐
public class GenericBasket<T> {
private T item;
public void setItem(T item) { this.item = item; }
public T getItem() { return item; }
}
`
这里的T就是泛型的“类型参数”,相当于一个占位符,用的时候你再指定具体类型。用起来就简单安全多了:
`java
GenericBasket<String> basket = new GenericBasket<>();
basket.setItem("矿泉水");
String drink = basket.getItem(); // 直接返回String,不用强制转换
// 要是你想放数字,编译器直接报错,根本不会让你写下去
`
是不是一下子就安全了?编译器帮你把好了类型的关,不用等到运行时才出问题。
常用泛型场景,解决实际开发的小麻烦
泛型不是只能写个储物筐,在日常开发里还有很多好用的地方。比如你经常用的ArrayList、HashMap,其实都是泛型类。以前你写ArrayList list = new ArrayList(),里面能放任何东西,取出来得转;现在写ArrayList<String> list = new ArrayList<>(),就只能放字符串,取出来直接用,不会出错。
还有泛型方法,比如你想写一个通用的打印任何类型数组的方法,不用分别写打印字符串数组、整数数组的方法,用泛型就能搞定:
`java
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
`
调用的时候,不管是字符串数组new String[]{"苹果", "香蕉"},还是整数数组new Integer[]{1,2,3},都能直接传进去,不用改方法。
用泛型的小注意点,避开这些坑
虽然泛型好用,但也有小细节要注意。比如你不能用new T()或者new T[10],因为泛型是“擦除”机制,运行时不知道具体类型,没法直接创建实例或者数组。要是想创建,得用反射或者传 Class 对象,就像你要做个“装书本的筐”,得先有书本的样子,才能批量做。
还有不能直接用new GenericBasket<T>(),得在类定义的时候就指定好类型参数,就像你做货架的时候,得先想好要贴什么标签,不能到放东西的时候才临时定。
其实泛型的核心就是让代码“通用又安全”,就像你给收纳盒贴了标签,既不用做多个不同的盒子,又不会拿错东西。下次写通用代码的时候,试试用泛型代替 Object,就能少踩很多类型转换的坑,代码也会更靠谱。