Java 泛型详解之类型参数的力量(最新推荐)

 更新时间:2025年10月30日 14:32:32   作者:ZHE|张恒  
本文系统讲解了Java泛型的定义、使用、通配符、边界及常见陷阱,强调了泛型在Java编程中的重要性,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

泛型(Generics)是 Java 类型系统的重要支柱。
它让代码更安全、更简洁、更通用,是理解现代 Java 编程的必修课。
本文将系统讲解 Java 泛型的定义、使用、通配符、边界与常见陷阱。

一、为什么需要泛型

在 Java 1.5 之前,集合只能存放 Object 类型:

List list = new ArrayList();
list.add("Hello");
list.add(123); // 不安全
String s = (String) list.get(0); // 强制类型转换

缺点:类型不安全、容易出错。

Java 1.5 引入 泛型机制(Generics),允许在定义类或方法时引入“类型参数”。

List<String> list = new ArrayList<>();
list.add("Hello");
// list.add(123); // 编译错误
String s = list.get(0); // 无需强转

二、泛型的基本语法

class Box<T> {          // 定义泛型类
    private T value;
    public void set(T value) { this.value = value; }
    public T get() { return value; }
}
Box<Integer> box = new Box<>();
box.set(100);
Integer data = box.get();
关键点说明
<T>声明类型参数(Type Parameter)
T类型变量,可代表任意引用类型
Box<Integer>实例化泛型类

三、泛型类与泛型接口

泛型类

class Pair<K, V> {
    private K key;
    private V value;
    public Pair(K key, V value) { this.key = key; this.value = value; }
    public K getKey() { return key; }
    public V getValue() { return value; }
}

泛型接口

interface Converter<F, T> {
    T convert(F from);
}
class StringToInteger implements Converter<String, Integer> {
    public Integer convert(String from) {
        return Integer.valueOf(from);
    }
}

四、泛型方法

方法也可以定义自己的类型参数:

public static <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}
String[] arr = {"A", "B", "C"};
printArray(arr); // 自动推断 T = String

⚡ 泛型方法的类型参数与类的泛型参数独立存在。

五、通配符:?的三种形态

通配符 ? 表示未知类型,常用于方法参数中。

通配符含义示例
?任意类型List<?> list
? extends TT 或其子类(上界通配符)List<? extends Number>
? super TT 或其父类(下界通配符)List<? super Integer>

示例:

public static void show(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
}
写入能力读取能力
? extends T✅ 读安全 ❌ 写
? super T✅ 写安全 ❌ 读(只能读为 Object)

六、边界与多重限制

class Calculator<T extends Number & Comparable<T>> {
    public boolean isGreater(T a, T b) {
        return a.compareTo(b) > 0;
    }
}

✅ 可指定多个上界,必须先是类后是接口。

七、泛型数组与类型推断

  • ❌ 泛型数组不能直接创建:new T[10](类型擦除原因)
  • ✅ 可使用 List 或 Array.newInstance() 代替。

类型推断:

List<String> list = List.of("A", "B");
var map = Map.of(1, "A", 2, "B"); // Java 10+

八、泛型的好处与限制

优点缺点
✅ 编译期类型安全❌ 运行时类型擦除
✅ 代码复用性高❌ 无法创建泛型数组
✅ 无需强转❌ 不能用基本类型

九、常见泛型陷阱

❌ 泛型类型不能用于静态上下文:

class Box<T> {
    // static T value; // 错误!
}

❌ 泛型类型无法用于 instanceof:

if (obj instanceof Box<String>) // 错误:类型擦除导致编译不通过

🔚 总结

分类关键语法示例
泛型类<T>class Box<T>
泛型方法<T>static <T> void print(T t)
通配符? extends / ? superList<? super Integer>
边界T extends Number限制类型范围

到此这篇关于Java 泛型详解之类型参数的力量(最新推荐)的文章就介绍到这了,更多相关java泛型参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何让@EnableConfigurationProperties的值注入到@Value中

    如何让@EnableConfigurationProperties的值注入到@Value中

    这篇文章主要介绍了如何让@EnableConfigurationProperties的值注入到@Value中的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Java基础知识杂文

    Java基础知识杂文

    这篇文章主要介绍了Java基础知识杂文,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 浅谈Java平台无关性

    浅谈Java平台无关性

    这篇文章主要介绍了浅谈Java平台无关性,对此感兴趣的同学,可以多了解一下
    2021-04-04
  • Java使用Redisson分布式锁实现原理

    Java使用Redisson分布式锁实现原理

    Redisson分布式锁 之前的基于注解的锁有一种锁是基本redis的分布式锁,这篇文章主要介绍了Java使用Redisson分布式锁实现原理,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • Java遍历Map键、值和获取Map大小的方法示例

    Java遍历Map键、值和获取Map大小的方法示例

    本篇文章主要介绍了Java遍历Map键、值和获取Map大小的方法示例,详细的介绍了Java遍历Map的两种实现方法和大小,具有一定的参考价值,有兴趣的可以了解一下。
    2017-01-01
  • java web实现邮箱激活与忘记密码

    java web实现邮箱激活与忘记密码

    这篇文章主要为大家详细介绍了java web实现邮箱激活与忘记密码、重置密码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Spring Boot与MyBatis配置与操作实战指南

    Spring Boot与MyBatis配置与操作实战指南

    本文介绍了如何在SpringBoot项目中配置和使用MyBatis,包括环境准备、数据源配置、MyBatis配置、数据操作、事务管理以及高级配置如缓存和插件的使用,通过这些步骤,可以实现高效的数据驱动应用程序开发,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • 从抛出异常到返回JSON/XML:SpringBoot 异常处理全链路深度解析

    从抛出异常到返回JSON/XML:SpringBoot 异常处理全链路深度解析

    Spring Boot (基于 Spring MVC) 提供了一套优雅的、解耦的异常处理机制,本文将带你深入底层,探究当一个异常被抛出后,究竟经历了怎样的奇幻漂流,又是如何根据前端需求自动变成 JSON 或 XML 的,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • java数据结构之二分查找法 binarySearch的实例

    java数据结构之二分查找法 binarySearch的实例

    这篇文章主要介绍了java数据结构之二分查找法 binarySearch的实例的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • Springboot如何通过yml配置文件为静态成员变量赋值

    Springboot如何通过yml配置文件为静态成员变量赋值

    这篇文章主要介绍了Springboot如何通过yml配置文件为静态成员变量赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10

最新评论