Java泛型

1.泛型是什么

先看一个类

ArrayList类是一个采用类型参数的泛型类,在Java的标准库中

它的使用方法

类名<泛型> 变量名 = new 类名<泛型>(参数);

java 复制代码
       ArrayList<Employee> staff = new ArrayList<>();

类型参数是什么

我们一般方法里面传参是变量,比如整型,浮点型,以及对象

这个就是把类型作为参数传入进去

传入的是类型

自定义的类,异常类,等等

2. 泛型从何而来?

  • 2004 年,Java 5(JDK1.5)正式引入。
  • 之前没有泛型,集合只能存 Object,什么类型都能往里塞:
java 复制代码
List list = new ArrayList();
list.add("abc");
list.add(123);
// 取出来必须强转,很容易 ClassCastException
String s = (String) list.get(1);

3. 泛型出现是为了解决什么问题?

三大核心问题:

  1. 类型不安全 错误类型混入集合,运行时才报错,难排查。

  2. 强制类型转换太多 每次取元素都要 (String)、(Integer),代码脏、易写错。

  3. 代码复用差 想写一个 "通用容器 / 通用算法",只能写 Object 版,既不安全也不优雅。

泛型的效果:

  • 编译期就检查类型,错了直接红,不让你运行;
  • 自动转换,不用手写强转;
  • 一套代码支持多种类型。

4. 泛型不能在什么时候用?有什么注意要点?

类型参数不能是基本类型 ❌ ArrayList<int> ✅ ArrayList<Integer>(必须用包装类)

5. 泛型为何有效?

靠两点:编译期检查 + 运行时擦除。

  1. 编译期(写代码时)

    • 编译器把 <T> 当成真实类型检查;
    • 不匹配直接报错,把异常拦在运行前;
    • 自动插入类型转换,你不用写。
  2. 运行时(执行时)

    • 泛型信息被擦除 :ArrayList<Integer> → ArrayList;
    • 实际存的还是 Object,保证和老代码兼容;
    • 所以叫 "伪泛型",但对使用者完全够用、安全。

一句话:编译期帮你把关,运行时不添负担,还能兼容旧代码。

6. 泛型如何实现(怎么把泛型带入类 / 方法)

java 复制代码
// 定义:类名后加 <E>
class MyList<E> {
    private E data;
    public void set(E d) { data = d; }
    public E get() { return data; }
}

// 使用:传入具体类型
MyList<Integer> list = new MyList<>();
list.set(10);
Integer x = list.get();
相关推荐
计算机毕设定制辅导-无忧学长7 小时前
《基于Spring Boot的迷游哈游戏综合服务平台的开发》
java·vue.js·spring boot·mysql·迷游哈游戏综合服务平台
非优秀程序员16 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻16 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
沐晓时光17 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
文丑颜不良啊18 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang20 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪20 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息20 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼21 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff1 天前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈