Java 泛型怎么用

你有没有过这样的经历:明明写了一段“通用代码”,却在运行时因为参数类型不对,突然弹出一个类型转换错误,整个程序直接“罢工”?比如你想写一个既能存书本、又能存手机的“收纳盒”,结果拿出来的时候,不小心把书本当成手机用,直接导致程序崩溃。其实这背后,就是泛型在解决的问题——让代码的“通用性”和“安全性”能同时兼顾。

什么是泛型?就是给代码装个“万能标签”

泛型说穿了,就是给类、方法或者接口加上一个“类型标签”,就像你给收纳盒贴个“装书本”“装零食”的标签一样。以前我们想做通用收纳,可能只能用 Object 类型,就像一个没有标签的空盒子,什么都能塞,但拿出来的时候得自己判断是什么东西,一不留神就拿错。

Java 泛型怎么用

举个生活化的例子:你开了个小杂货铺,想做个“通用货架”,既能放零食、又能放文具。不用泛型的话,你可能会写个货架,能放任意东西,但是每次拿商品都得自己回忆“上次放的是零食还是文具”,很容易搞错。用了泛型,你就可以给货架贴个标签,比如“货架<零食>”,这个货架就只能放零食,拿出来的也肯定是零食,不用再猜。

用泛型写“安全的通用代码”,从一个简单的例子开始

假设你想做一个“储物筐”,能装任何类型的东西,以前的写法可能是这样:

`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,就能少踩很多类型转换的坑,代码也会更靠谱。

上一篇 C / C++语言的核心特性与应用场景,入门者必知的知识科普