温馨提示×

温馨提示×

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

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

java泛型如何工作

发布时间:2026-09-30 20:33:42 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

Java 泛型(Generics)是在 JDK 5 引入的,用来在编译期提供类型安全和代码复用。下面从「是什么、怎么用、底层原理、常见陷阱」几个角度说明。


一、泛型是什么

泛型允许你在定义类、接口、方法时使用类型参数,在使用时再指定具体类型。

List<String> list = new ArrayList<>();
list.add("hello");
// list.add(123); // 编译错误

好处:

  • 编译期类型检查
  • 避免强制类型转换
  • 代码更通用、可读性更好

二、常见使用方式

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("abc");

2. 泛型接口

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

3. 泛型方法

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

4. 通配符(Wildcard)

上界通配符

List<? extends Number> list;

✅ 可读 Number
❌ 不能写(除 null)

下界通配符

List<? super Integer> list;

✅ 可写 Integer
❌ 读出来是 Object

无界通配符

List<?> list;

三、泛型底层原理(重点)

✅ 类型擦除(Type Erasure)

Java 泛型是编译期特性,运行时不存在泛型信息。

List<String> 和 List<Integer>

在 JVM 中都是:

List

编译器做了什么?

  1. 替换泛型为边界类型(默认 Object)
  2. 自动插入类型转换
  3. 生成桥接方法(bridge method)

示例:

class Box<T> {
    T value;
}

编译后等价于:

class Box {
    Object value;
}

桥接方法(Bridge Method)

class A implements Comparable<String> {
    public int compareTo(String s) { ... }
}

编译器生成:

public int compareTo(Object o) {
    return compareTo((String) o);
}

四、泛型限制(很重要)

❌ 不能 new T()

T obj = new T(); // 编译错误

❌ 不能用基本类型

List<int> // ❌
List<Integer> // ✅

❌ 不能创建泛型数组

T[] arr = new T[10]; // ❌

❌ 运行时不能判断泛型

if (obj instanceof List<String>) // ❌

五、常见面试点总结

  • 泛型是 编译期安全 + 运行时擦除
  • 泛型 ≠ 模板(不像 C++ 模板)
  • List<String> 和 List<Integer> 字节码相同
  • PECS 原则:
    • Producer → extends
    • Consumer → super

如果你愿意,我可以:

  • 用 字节码角度讲泛型
  • 对比 Java vs C++ 泛型
  • 结合 Spring / 集合源码讲泛型实战

你想从哪方面深入?

向AI问一下细节

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

AI
助
手