温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么理解java泛型

发布时间:2026-09-30 21:03:43 来源:亿速云 阅读:87 作者:小樊 栏目:编程语言

理解 Java 泛型(Generics),可以从「是什么、为什么、怎么用、底层原理、常见坑」几个层面来看。


一、什么是 Java 泛型

泛型是 JDK 5 引入的一种参数化类型机制,让类、接口、方法在定义时不指定具体类型,而是在使用时再指定。

List<String> list = new ArrayList<>();

这里的 <String> 就是泛型参数,表示“这个 List 只能装 String”。


二、为什么要使用泛型

在没有泛型之前:

List list = new ArrayList();
list.add("abc");
list.add(123); // 编译不报错

取出来时要强转,容易 ClassCastException。

泛型的好处:

  1. 编译期类型安全
  2. 避免强制类型转换
  3. 代码更通用、可读性更好

三、泛型的基本用法

1. 泛型类

class Box<T> {
    private T value;

    public void set(T value) { this.value = value; }
    public T get() { return value; }
}

使用:

Box<String> box = new Box<>();
box.set("hello");

2. 泛型接口

interface Repository<T> {
    void save(T t);
}

3. 泛型方法

public <T> T getFirst(List<T> list) {
    return list.get(0);
}

四、泛型通配符(重点)

1. 无界通配符 ?

List<?> list; // 未知类型

2. 上界通配符 ? extends T

List<? extends Number> list;

表示:只能是 Number 或其子类(如 Integer、Double)

✅ 适合 读取

3. 下界通配符 ? super T

List<? super Integer> list;

表示:只能是 Integer 或其父类(如 Number、Object)

✅ 适合 写入


五、泛型底层原理(关键点)

Java 泛型是 编译期机制(伪泛型),不是真正运行时的泛型。

叫:类型擦除(Type Erasure)

List<String> 和 List<Integer>

编译后都变成:

List

⚠️ 所以:

  • 不能 new T()
  • 不能用 T.class
  • 不能 instanceof T

六、常见易错点

  1. 不能创建泛型数组
T[] arr = new T[10]; // ❌
  1. 泛型不能是基本类型
List<int> ❌
List<Integer> ✅
  1. 静态成员不能用类泛型
class A<T> {
    static T x; // ❌
}

七、一句话总结

Java 泛型 = 编译期类型安全 + 代码复用,本质是 类型擦除的参数化类型。

如果你愿意,我可以:

  • 用 生活化比喻再讲一遍
  • 对比 C++ 模板 / Kotlin 泛型
  • 结合 面试常问泛型题来讲
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手