惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
A
About on SuperTechFans
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
F
Fortinet All Blogs
Blog — PlanetScale
Blog — PlanetScale
MongoDB | Blog
MongoDB | Blog
MyScale Blog
MyScale Blog
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
月光博客
月光博客
博客园 - Franky
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
Jina AI
Jina AI
有赞技术团队
有赞技术团队
博客园_首页

Hsu Yeung 的博客

三圣花市 | Hsu Yeung 的博客 网站支持 Live Photo 图片展示 | Hsu Yeung 的博客 梦 | Hsu Yeung 的博客 周末午餐 | Hsu Yeung 的博客 张家界 | Hsu Yeung 的博客 话剧《寻她芳踪·张爱玲》 | Hsu Yeung 的博客 博客自动生成文章目录 | Hsu Yeung 的博客 灭螂行动! | Hsu Yeung 的博客 张靓颖成都演唱会 | Hsu Yeung 的博客 最近对博客做的一些微调总结 | Hsu Yeung 的博客 Windows 上安装 Lua | Hsu Yeung 的博客 网站支持展示 B 站 iframe 视频 SpringBoot 中使用 RedisTemplate 存取整数值的坑 | Hsu Yeung 的博客 SQL JOIN 中 ON 与 WHERE 的区别 值得记录的一些工作近况 | Hsu Yeung 的博客 周传雄成都演唱会 | Hsu Yeung 的博客 并行操作导致获取数据库连接超时 | Hsu Yeung 的博客 风信子 | Hsu Yeung 的博客 Linux 安装并配置 Nginx | Hsu Yeung 的博客 使用 logrotate 切割 nginx 日志 郁金香土培结果 | Hsu Yeung 的博客 MySQL LEFT JOIN 右表有多条数据但只取最新的一条 | Hsu Yeung 的博客 获取数据库锁等待超时问题 | Hsu Yeung 的博客 从零开始挑选相机 | Hsu Yeung 的博客 郁金香 | Hsu Yeung 的博客 我的第一束花 | Hsu Yeung 的博客 快乐的一周 | Hsu Yeung 的博客 重庆,来了 | Hsu Yeung 的博客 散步 | Hsu Yeung 的博客 Git 工作区、暂存区、版本库之间的关系 | Hsu Yeung 的博客
自动拆箱机制导致编译失败 | Hsu Yeung 的博客
2023-07-20 · via Hsu Yeung 的博客

之前写参数校验的时候将字段的长度写成了一个常量,习惯了用包装类型,于是乎有了类似(以下截图只是为了复现这个问题刚特意改的)如下的代码:

常量为包装类型
常量为包装类型

结果项目编译报错,提示我这里传入的不是一个常量:

编译错误
编译错误

心想“我这个字段都用 staticfinal 修饰了,怎么就不是常量了?”带着这个“疑问”点开 @Size 注解的定义:

注解定义
注解定义

发现其中 minmax 字段的定义是 int 基本类型,并不是 Integer 包装类型,再想到 Java 中基本类型与其对应的包装类型之间的自动装箱和拆箱机制,一下就明白了。我定义的是 Integer 类型的常量,当赋值给 int 类型的字段时,Java 编译器会自动将其拆箱为 int 类型。而这个拆箱的实现方式,其实就是调用 Integer 对象的 .intValue() 方法(其他几个包装类型同理)。

所以我们定义的 Integer “常量”对编译器来说实际上是 Integer.intValue() 这样一个方法调用,明显已经不是一个常量表达式了。

知道原因后,将 Integer 修改为 int:

常量为基本类型
常量为基本类型

再来编译试试,发现这下编译通过了:

编译通过
编译通过

我们可以通过以下例子来验证上面的问题:

验证自动装箱、拆箱
验证自动装箱、拆箱

编译后通过 javap 命令查看编译后的字节码,可以看出来,自动装箱实际上就是调用的 Integer.valueOf() 方法,拆箱就是调用的 Integer.intValue() 方法:

查看编译后的字节码
查看编译后的字节码

这样也就能明白为什么将一个 Integer 常量赋值给 int 时就不是常量了。