Java 泛型:代码界的变形金刚,谁用谁上瘾!

前言

“听说过泛型,但从来没用过”,你是不是也这么说?
“泛型?我用了呀,就是 <T> 这个东西嘛。”你是不是这么想?
那今天这篇文章,就让你从泛型菜鸟进化成泛型大厨,写出别人看到想点赞,自己看了想加班的代码!


一、泛型到底是啥?(别怕,看完你就懂!)

通俗地说,泛型就是让代码更通用、更安全、更省事的一个神器

想象一下,你有一个百宝箱,这个箱子可以装不同类型的东西(比如水果、蔬菜、工具),但你不用再为每种类型单独买个箱子。泛型就是给你这个“百宝箱”的!

代码类比
没有泛型的时候:

List list = new ArrayList();
list.add("苹果");
list.add(123); // 我是谁?我在哪?我为什么能进来?

有了泛型以后:

List<String> fruits = new ArrayList<>();
fruits.add("苹果");
// fruits.add(123); // 报错:123 不是水果!

泛型的两个好处

  1. 类型安全:防止“李逵”混入“李鬼”。
  2. 避免强制类型转换:省去 Object 的转换烦恼。

二、泛型的实战操作(是时候秀肌肉了!)

1. 泛型方法:小而美的实用工具

泛型不仅能用在类上,还能用在方法上!比如你想实现一个工具方法,用来打印任何类型的数组:

public static <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

用法:

String[] fruits = {"苹果", "香蕉", "橘子"};
printArray(fruits);  // 输出:苹果、香蕉、橘子

Integer[] numbers = {1, 2, 3};
printArray(numbers);  // 输出:1、2、3

这里的 <T> 是个占位符,意思是:这个方法的类型参数可以是任何类型,你调用的时候才指定。

2. 泛型类:开箱即用的百宝箱

如果你要实现一个自己的“盒子”,用来装任何东西,泛型类绝对是你的好帮手:

class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

用法:

Box<String> stringBox = new Box<>();
stringBox.setItem("泛型大法好!");
System.out.println(stringBox.getItem());  // 输出:泛型大法好!

Box<Integer> intBox = new Box<>();
intBox.setItem(42);
System.out.println(intBox.getItem());  // 输出:42
3. 边界约束:泛型的“圈地运动”

有时候你不想让泛型太自由(比如不能让“老虎”跑进“羊圈”),可以用 extendssuper 限制它的类型范围。

例子:我们只允许装水果或水果的子类(比如苹果、香蕉):

class Fruit {}
class Apple extends Fruit {}

class FruitBox<T extends Fruit> {
    private T fruit;

    public void setFruit(T fruit) {
        this.fruit = fruit;
    }

    public T getFruit() {
        return fruit;
    }
}

用法:

FruitBox<Apple> appleBox = new FruitBox<>();
appleBox.setFruit(new Apple()); // 妥妥的!

// FruitBox<String> stringBox = new FruitBox<>(); // 报错:不是水果!

三、泛型的常见“坑点”(别掉坑,划重点!)

  1. 泛型不能用基本类型
    你想用 List<int>?抱歉,Java 不允许!需要用包装类,比如 List<Integer>

  2. 类型擦除
    Java 的泛型在运行时会被“擦除”,意思是泛型信息只存在于编译阶段,运行时全变成了 Object
    示例

List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
System.out.println(list1.getClass() == list2.getClass()); // true
  1. 静态成员不能使用泛型
    因为泛型是类级别的,而静态成员是全局共享的,二者冲突。

四、总结(最后的升华)

泛型,是 Java 中为数不多的“既优雅又实用”的工具。掌握泛型,你的代码不仅能跑得更快,还能笑得更帅!

所以,下次写代码时,不妨想想:
“这里用泛型,能不能更优雅一点?”

今天的小挑战:写一个泛型类,支持装多个物品,但只能拿出来符合指定类型的物品,试试看吧!


五、彩蛋:一句话概括泛型

泛型就像个“万能接口”,能让代码 强类型约束灵活扩展性 并存。
记住T,不仅是类型,更是“代码世界的未来”!

推荐阅读文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔道不误砍柴功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值