《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

 

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
3月前
|
算法 Java
「译文」Java 垃圾收集参考手册(四):Serial GC
「译文」Java 垃圾收集参考手册(四):Serial GC
|
3月前
|
算法 Java PHP
「译文」Java 垃圾收集参考手册(一):垃圾收集简介
「译文」Java 垃圾收集参考手册(一):垃圾收集简介
|
3月前
|
网络协议 Java Maven
Java自救手册
Java自救手册
58 2
|
1月前
|
人工智能 Kubernetes Java
Java开发工程师如何紧跟技术前沿对于保持专业竞争力、提升工作效率以及适应行业发展?
【4月更文挑战第4天】Java开发工程师如何紧跟技术前沿对于保持专业竞争力、提升工作效率以及适应行业发展?
25 4
|
2月前
|
消息中间件 Dubbo Java
互联网 Java 工程师1000道面试题(485页)
互联网 Java 工程师1000道面试题(485页)
31 0
|
2月前
|
人工智能 监控 Java
招个Java工程师,却发现了一个宝藏平台
招个Java工程师,却发现了一个宝藏平台
24 0
招个Java工程师,却发现了一个宝藏平台
|
3月前
|
SQL 存储 Java
[Java]细节、经验
[Java]细节、经验
46 0
[Java]细节、经验
|
3月前
|
算法 安全 Java
「译文」Java 垃圾收集参考手册(三):GC 算法基础篇
「译文」Java 垃圾收集参考手册(三):GC 算法基础篇
|
3月前
|
算法 Java
「译文」Java 垃圾收集参考手册(五):Parallel GC
「译文」Java 垃圾收集参考手册(五):Parallel GC
|
3月前
|
算法 Java
「译文」Java 垃圾收集参考手册(六):Concurrent Mark and Sweep
「译文」Java 垃圾收集参考手册(六):Concurrent Mark and Sweep