《Java工程师必读手册》——Java经验之谈系列——那些年,我们踩过的那些Java坑(3)

简介: 《Java工程师必读手册》——Java经验之谈系列——那些年,我们踩过的那些Java坑(3)

接上篇:https://developer.aliyun.com/article/1228289?groupCode=java

三、 泛型对象赋值

 

Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,即把数据类型做为一个参数使用。

 

1. 问题现象

 

在做用户数据分页查询时,因为笔误编写了如下代码:

 

1) PageDataVO.java

 

image.png

 

2) UserDAO.java

 

image.png 

 

3) UserService.java

 

image.png 

 

以上代码没有任何编译问题,但是却把UserDO中一些涉密字段返回给前端。细心的读者可能已经发现了,在UserService类的queryUser方法的语句return new PageDataVO(totalCountdataList);中,我们把List对象dataList赋值给了PageDataVO的List字段dataList。

 

问题是:为什么开发工具不报编译错误啦?

 

2. 问题分析

 

由于历史原因,参数化类型和原始类型需要兼容。我们以ArrayList举例子,来看看如何兼容的。

 

以前的写法:

 

image.png 

 

现在的写法:

 

image.png 

 

考虑到与以前的代码兼容,各种对象引用之间传值,必然会出现以下的情况:

 

image.png 

 

所以,Java编译器对以上两种类型进行了兼容,不会出现编译错误,但会出现编译告警。但是,我的开发工具在编译时真没出现过告警。

 

再来分析我们遇到的问题,实际上同时命中了两种情况:

 

把List对象赋值给List,命中了第一种情况;

把PageDataVO对象赋值给PageDataVO,命中了第二种情况。

 

最终的效果就是:我们神奇地把List对象赋值给了List。

问题的根源就是:我们在初始化PageDataVO对象时,没有要求强制进行类型检查。

 

3. 避坑方法

 

1) 在初始化泛型对象时,推荐使用diamond语法

 

在《阿里巴巴Java开发手册》中,有这么一条推荐规则:

 

【推荐】集合泛型定义时,在JDK7及以上,使用diamond语法或全省略。

 

说明

菱形泛型,即 diamond,直接使用<>来指代前边已经指定的类型。

 

正例

 

image.png 

 

其实,初始化泛型对象时,全省略是不推荐的。这样会避免类型检查,从而造成上面的问题。

 

在初始化泛型对象时,推荐使用diamond语法,代码如下:

 

image.png 

 

现在,在Eclipse的问题窗口中,我们会看到这样的错误:

 

image.png 

 

于是,我们就知道忘记把List对象转化为List对象了。


接下篇:https://developer.aliyun.com/article/1228287?spm=a2c6h.13148508.setting.22.7be64f0ebemzoR

 

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
打赏
0
0
0
0
1028
分享
相关文章
Java工程师如何理解张量?
刚接触AI和PyTorch,理解“张量(Tensor)”是入门关键。张量可类比为Java中的多维数组,但更强大,尤其在AI领域支持GPU加速、自动求导等特性。它不仅能高效存储数据,还能进行复杂运算,是深度学习的核心数据结构。掌握张量的维度、数据类型及GPU加速特性,对学习PyTorch至关重要。
56 3
Java开发工程师的职业规划应该是什么样的?
Java开发工程师的职业规划涵盖多个阶段,包括初入行业(0-1年)、技能提升(1-3年)、技术专家(3-5年)及管理或专家路线选择(5年以上)。各阶段设定了明确的技能要求与职业目标,从掌握Java基础、常用框架到深入研究高级技术、微服务架构乃至担任管理职务或成为技术专家。通过持续学习与实践,结合个人兴趣,Java工程师可在技术或管理领域找到合适的发展方向,最终实现职业成功。
759 83
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
129 19
Java开发工程师转哪个行业比较好?
Java开发工程师转哪个行业比较好?
467 2
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
Java开发工程师转小程序开发的前景如何?
Java开发工程师转小程序开发的前景如何?
90 0
|
8月前
|
图解java工程师学习路线
图解java工程师学习路线
298 0
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
57 0
|
9月前
|
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
65 0
技术经验解读:一文带你搞懂java中的变量的定义是什么意思
技术经验解读:一文带你搞懂java中的变量的定义是什么意思
81 0