java中int转long是自动类型提升,因int(32位)是long(64位)的子集,所有int值均可被long精确表示,编译器执行不丢失精度的拓宽转换。

Java中int转long是自动类型提升,无需显式转换,但需理解其原理和边界情况。
为什么int能直接赋值给long
Java规定int(32位)属于long(64位)的子集,所有int值都能被long精确表示。编译器会自动执行拓宽转换(widening conversion),不丢失精度,也不抛异常。
- int范围:-2,147,483,648 到 2,147,483,647
- long范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
- 因此每个int值在long中都有唯一、等价的表示
三种常用写法及适用场景
虽然自动转换最简洁,但不同写法适用于不同上下文:
-
直接赋值(推荐):
int i = 100; long l = i;—— 简洁安全,编译通过 -
显式强制转换:
long l = (long) i;—— 语义明确,适合强调类型意图(如配合泛型或反射) -
使用Long.valueOf()或new Long():
long l = Long.valueOf(i).longValue();—— 不推荐用于基本类型转换,仅在需要包装类对象时考虑(注意:new Long()已废弃)
需要注意的特殊情况
看似简单,但以下情况容易引发误解:
- 算术运算中混合类型:如
int a = Integer.MAX_VALUE; long b = a + 1;,此处a + 1仍按int计算,会溢出为Integer.MIN_VALUE,再转long —— 正确写法应为long b = (long) a + 1; - 方法重载歧义:若存在
void foo(int)和void foo(long),传入int字面量会优先匹配int版本;想调用long版本需显式转换或加L后缀(如foo(100L)) - 数组或集合中类型不兼容:
int[]不能直接转为long[],需逐元素转换
与String或其他类型转换的区别
int转long是基本类型间的拓宽转换,和String转long完全不同:
-
long l = Integer.parseInt("123");是字符串解析,可能抛NumberFormatException -
long l = Long.parseLong("123");同样是字符串解析,支持更大范围,但仍是运行时操作 - 而
int → long是编译期确定、零开销的隐式转换,无异常风险
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











