Java强制转换需谨慎:基本类型静默截断易丢精度溢出,引用类型向下转型可能抛ClassCastException,泛型因类型擦除存在运行时风险,应优先用instanceof检查或工具方法保障安全。

Java 强制转换不是“加括号就完事”,而是把类型解释权交到你手上——编译器不拦、不预警、不兜底,转对了是功能,转错了就是 ClassCastException 或静默丢数据。
语法必须写对:括号+准确类型名
基本写法统一为:(目标类型) 表达式。括号不能省,类型名必须与实际兼容。
- 基本类型转换:如
int i = (int) 3.14;(截小数,得 3) - 引用类型向下转型:如
Object obj = new String("ok"); String s = (String) obj;(合法,因实际类型匹配) - 编译直接拒绝的情况:如
(String) new Date()(String 与 Date 无继承关系)
基本类型强转:静默截断比报错更危险
它不会抛异常,但会直接丢精度、溢出翻符号、结果不可逆。
-
(int) 9.99→ 得 9(向零截断,非四舍五入) -
(byte) 200→ 得 -56(超出 [-128, 127],只取低 8 位补码) -
(int) 3_000_000_000L→ 得 -1294967296(long 超 int 范围,高位丢失) - 敏感场景建议用
Math.toIntExact(long),溢出会明确抛ArithmeticException
引用类型向下转型:ClassCastException 随时爆发
编译只看声明类型是否可转,运行才查真实类型。错一次,崩一次。
立即学习“Java免费学习笔记(深入)”;
- 高危场景:从
List<Object>取值后直转、JSON 解析默认返回Double却当Integer强转 - 安全做法:先
if (obj instanceof String),再(String) obj(注意instanceof null返回 false) - 更优解:封装工具方法,或用
Optional<String>包装,避免下游硬转
泛型强转:擦除让“看起来合法”变成陷阱
泛型在运行时不存在,所谓 (List<String>) list 实际只是 (List) list,类型信息早已丢失。
-
(List<String>) new ArrayList<Integer>()编译通过,但get(0)后强转String才报错 - 禁止对参数化类型裸强转;必须转时,加
@SuppressWarnings("unchecked")并配单元测试验证 - 需保留类型信息:用
TypeReference<List<String>>(Jackson)或工厂方法封装


















