当前位置: 首页 > news >正文

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限制类型范围
http://www.dtcms.com/a/544703.html

相关文章:

  • 基于python大数据的井盖监控系统的设计与开发
  • 记一次ThreadLocal导致的生产事故
  • Rust 入门基础:安全、并发与高性能的系统编程语言
  • PyCharm + 远程调试路径映射总结(以 diffusers 为例)
  • HTML常用特殊字符
  • 手机网站设计公司哪家好保定网站设计
  • 网站建设焦作合肥做网站的的公司有哪些
  • Rust HashSet 与 BTreeSet深度剖析
  • Java二分算法题目练习
  • AI工具赋能需求管理 Jira
  • PostgreSQL 六大索引
  • 2025年--Lc224--100. 相同的树(递归,dfs,带测试用例)-Java版
  • Python打造美观的桌面温馨提醒弹窗
  • 北京网站制作建设太原it培训机构
  • certbot+shell+阿里云api+k8s实现自动化更新SSL证书
  • Linux小课堂: 系统核心技能与应用总结与进阶指南
  • 前端vue项目在vscode使用插件部署到服服务器的方法
  • 使用Labelimg进行图像标注
  • 【计算机软件资格考试】软考案例分析题及解析模拟题10
  • IoTDA应用侧app开发403报错解决方案
  • 3.1 Lua代码中的元表与元方法
  • Rust——多重借用的冲突解决方案:驾驭Rust借用检查器的艺术
  • kaggle比赛与常用的dash board 3lc
  • 适配器模式:让不兼容的接口协同工作
  • Neo4j中导入.owl数据
  • 应急救援 “眼观六路”:SA/NSA 双模覆盖,偏远灾区也能实时传视频
  • 站长工具短链接生成网站中队人物介绍怎么做
  • 【Spring Boot + Spring Security】从入门到源码精通:藏经阁权限设计与过滤器链深度解析
  • 《嵌入式硬件(十七):基于IMX6ULL的温度传感器LM75a操作》
  • 用 Go 手搓一个内网 DNS 服务器:从此告别 IP 地址,用域名畅游家庭网络!