.泛型擦除引起的问题及解决方法

简介: Java泛型类型检查在编译时针对引用而非对象本身。即使类型擦除后变为Object,编译器仍会根据引用的泛型声明(如ArrayList<String>)对add等方法调用进行类型检查。直接使用原始类型(如ArrayList)会失去泛型保护,仅产生警告。因此,类型安全由引用决定。

先检查,再编译以及编译的对应和引用传递问题
这里我们可能会有一个疑问,既然说类型变量会在编译的时候擦除掉,那为什么上面的ArrayList中添加String类型的时候就报错了呢,因为String编译时候也会变成Object啊?
A:因为JAVA编译器是通过先检查代码中泛型的类型,然后再进行类型擦除,再进行编译的。那么这个检查到底是针对谁的,我们需要再明确下
A2:如我们上面代码是:
ArrayList list = new ArrayList();
现在我们写成:
ArrayList list = new ArrayList();
此时如果我们与之前的代码兼容,各种引用传值之间,必然会出现下面情况:
ArrayList list1 = new ArrayList(); //第一种 情况
ArrayList list2 = new ArrayList(); //第二种 情况
这样没错,但是会有个编译时警告,不过在第一种情况下,可以实现与完全使用泛型参数一样的效果,但是第二种没有效果。
因为类型检查是编译时完成的,new ArrayList()只是在内存中开辟一个存储空间,可以存储任何类型的对象,而真正涉及类型检查的是“它的引用”,即list1的方法调用,如add方法,所以list1引用能够完成泛型类型检查(前面声明了String),但是list2(后面声明的只是开辟内存空间,不涉及)由于前面的声明没有添加泛型,所以不行。

所以这里我们也大概知道了,所谓的类型(泛型)检查,是针对引用的。谁是一个引用,用这个引用调用泛型方法,就会对这个引用所调用的方法进行类型检查,而无关它真正引用的对象

相关文章
|
开发框架 前端开发 网络协议
使用 DataAnnotations(数据注解)实现模型的通用数据校验
在实际项目开发中,无论任何方式、任何规模的开发模式,项目中都离不开对接入数据模型参数的合法性校验,目前普片的开发模式基本是前后端分离,当用户在前端页面中输入一些表单数据时,点击提交按钮,触发请求目标服务器的一系列后续操作,在这中间的执行过程中(标准做法推荐)无论...
43995 1
使用 DataAnnotations(数据注解)实现模型的通用数据校验
|
缓存 JavaScript 开发工具
【开发工具】解决webstorm:Loading indexes...
【开发工具】解决webstorm:Loading indexes...
1282 0
|
4月前
|
自然语言处理 网络协议 安全
开发者如何集成IP查询功能?主流IP离线库全面解读与性能对比
本文聚焦开发者IP查询功能集成需求,对比IP数据云、IPinfo、IP2Location等主流IP离线库的覆盖范围、精度、性能等核心维度,提供选型与集成指南,助力金融、政企等场景高效落地,凸显高精度、高可用性的离线库价值。
|
6月前
|
监控 前端开发 测试技术
Playwright为什么老是跑不稳?12个坑踩完我终于懂了!
周五下班前,测试全绿、CI顺畅,才是理想状态。若Playwright测试常慢、失败、截图冗余,说明需优化。本文12条实战建议:用例按风险分层、稳定定位、去sleep、复用登录态、API准备数据、合理mock、精准视觉回归、按需trace、控制并发、封装业务流、追踪不稳用例、标准化报告。让发版安心,告别焦虑。
|
JSON JavaScript Linux
【MCP教程系列】如何自己打包MCP服务并部署到阿里云百炼上
本文章以阿里云百炼的工作流为例,介绍如何将其封装为MCP服务并部署到平台。主要步骤包括:1)使用Node.js和TypeScript搭建MCP服务;2)将项目打包并发布至npm官方平台;3)在阿里云百炼平台创建自定义MCP服务;4)将服务添加到智能体中进行测试。通过这些步骤,您可以轻松实现工作流的MCP化,并在智能体中调用自定义服务。
4990 107
|
6月前
|
Prometheus 监控 Cloud Native
【经典面试场景题】线上服务器如果磁盘满了,你会如何处理?
线上服务器磁盘满将导致服务异常,需立即处理。首先通过 `df -h` 和 `du -sh /*` 定位占用空间大的目录,清理临时文件与大日志文件,可清空而非删除正在使用的日志。使用 `find / -size +1G` 查找大文件,释放空间。长期应配置日志轮转、磁盘监控告警、定期清理脚本,并分离系统、数据与日志分区,避免再次打满。
377 0
|
存储 NoSQL Java
aspect实现mock-feign接口
该代码为一个用于Feign接口的模拟(Mock)实现类`FeignMockAspect`,通过切面编程方式对带有`@FeignClient`注解的接口提供模拟响应。在非生产环境中,根据特定配置从Redis中获取Mock数据并转换为对应类型的对象返回,以减少对外部系统的依赖和提高测试效率。使用Hutool工具类和Spring Data Redis进行数据处理与存储操作。
|
存储 关系型数据库 MySQL
MySQL索引底层实现原理(B树和B+树)
MySQL索引底层实现原理(B树和B+树)
607 0
MySQL索引底层实现原理(B树和B+树)
|
前端开发 JavaScript 容器
一个可搜索的表格
一个可搜索的表格