首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 泛型(Generics)全面解析:原理、应用及高级技巧

Java 泛型(Generics)全面解析:原理、应用及高级技巧

原创
作者头像
用户11690571
发布2025-06-10 22:11:53
发布2025-06-10 22:11:53
26800
代码可运行
举报
运行总次数:0
代码可运行

一、泛型简介

Java 泛型是 JDK 5 引入的语言特性,用于实现类型参数化,增强代码的类型安全和复用性。通过泛型,我们可以在类、接口和方法定义时指定类型参数,避免强制类型转换并减少运行时异常。


二、为什么需要泛型?

传统代码中常使用 Object 类型来实现通用方法或容器,但这样会带来:

  • 类型不安全
  • 频繁的强制类型转换,代码繁琐且易错

泛型在编译时进行类型检查,保证类型安全。


三、泛型的基本语法

3.1 泛型类定义

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }
    public T getContent() {
        return content;
    }
}

使用示例:

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String str = stringBox.getContent();

3.2 泛型方法定义

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑public <E> void printArray(E[] array) {
    for (E element : array) {
        System.out.println(element);
    }
}

四、泛型通配符

4.1 ? 通配符的使用

  • ? extends T:上界通配符,表示类型是 T 或 T 的子类
  • ? super T:下界通配符,表示类型是 T 或 T 的父类
  • ?:无界通配符,表示任意类型

4.2 例子

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑List<? extends Number> list1; // 只能读取,不能添加
List<? super Integer> list2; // 可以添加 Integer 及其子类

五、泛型的类型擦除原理

Java 泛型通过类型擦除实现向后兼容:

  • 编译时,泛型类型被替换为原始类型(如 Object 或指定的上界)
  • 编译器插入类型转换代码,保证类型安全

六、泛型在集合中的应用

泛型极大提升了集合框架的安全性和便利性:

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑List<String> list = new ArrayList<>();
list.add("Java");
String s = list.get(0); // 无需强制转换

七、泛型高级技巧

7.1 泛型与继承

  • List<String> 不是 List<Object> 的子类型
  • 使用通配符实现灵活的参数传递

7.2 泛型数组限制

Java 不允许直接创建泛型数组:

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑T[] arr = new T[10]; // 编译错误

解决方法:

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑@SuppressWarnings("unchecked")
T[] arr = (T[]) new Object[10];

八、实战案例:泛型实现通用缓存类

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑public class Cache<K, V> {
    private Map<K, V> map = new HashMap<>();

    public void put(K key, V value) {
        map.put(key, value);
    }
    public V get(K key) {
        return map.get(key);
    }
}

九、总结

  • 泛型增强代码复用和安全性
  • 理解类型擦除有助于排查泛型相关问题
  • 通配符提高代码灵活性
  • 泛型与反射、集合、接口等结合使用更强大 深入理解 Java 多线程编程:线程生命周期、同步机制与并发工具实战

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、泛型简介
  • 二、为什么需要泛型?
  • 三、泛型的基本语法
    • 3.1 泛型类定义
    • 使用示例:
    • 3.2 泛型方法定义
  • 四、泛型通配符
    • 4.1 ? 通配符的使用
    • 4.2 例子
  • 五、泛型的类型擦除原理
  • 六、泛型在集合中的应用
  • 七、泛型高级技巧
    • 7.1 泛型与继承
    • 7.2 泛型数组限制
  • 八、实战案例:泛型实现通用缓存类
  • 九、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档