int到long的转换是安全、自动且零开销的拓宽转换,编译期完成,不丢失精度;适用于直接赋值、字面量赋值、混合运算和方法传参,但需警惕运算溢出、重载歧义及数组/集合不兼容问题。

Java 中 int 到 long 的转换是安全、自动且零开销的,因为 int(32 位)的所有取值都能被 long(64 位)精确表示,编译器会在编译期完成拓宽转换,不丢失精度,也不抛异常。
什么时候会自动转换
以下场景无需任何操作,Java 编译器自动完成 int → long:
- 直接赋值:int i = 123; long l = i;
- 字面量赋值:long l = 123;(整数字面量默认为 int,但赋给 long 变量时自动提升)
- 算术混合运算:int a = 5; long b = a + 100L;(a 自动转为 long,整个表达式按 long 计算)
- 方法传参:void print(long x) { };调用 print(42); 时,42(int 字面量)自动转为 long
推荐写法与慎用方式
虽然自动转换最常用,但不同写法适用于不同语义需求:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 直接赋值(首选):简洁、高效、意图清晰,如 long l = i;
- 显式强制转换:long l = (long) i;——适合强调类型意图,例如在泛型边界、反射调用或代码审查中突出“此处需 long 语义”
- 避免用包装类转换基本类型:Long.valueOf(i).longValue() 或 new Long(i) 属于冗余操作,有装箱开销,且 new Long() 已废弃;仅在确实需要 Long 对象(如集合、泛型、null 安全场景)时才用 Long.valueOf(i)
容易出错的典型陷阱
看似简单,但以下情况常导致结果不符合预期:
立即学习“Java免费学习笔记(深入)”;
- 运算优先级掩盖溢出:int a = Integer.MAX_VALUE; long b = a + 1; 表面看是转 long,但 a + 1 仍按 int 运算,先溢出为 -2147483648,再转 long —— 结果仍是负数。正确写法是 long b = (long) a + 1; 或 long b = a + 1L;
- 方法重载歧义:若存在 void f(int) 和 void f(long),传入 f(100) 会调用 int 版本;想调用 long 版本需写 f(100L) 或 f((long)100)
- 数组/集合不兼容:int[] 不能转成 long[],必须逐元素赋值;List<Integer> 也不能直接转为 List<Long>,需流式映射:list.stream().map(Long::valueOf).collect(Collectors.toList())
和 String 转 long 的本质区别
int → long 是编译期确定的隐式拓宽,无异常、无运行时开销;而 String → long 是运行时解析,例如 Long.parseLong("123") 或 Integer.parseInt("123"),可能抛 NumberFormatException,且涉及字符串解析逻辑,两者不可混用或替代。

















