强制类型转换是显式告知编译器按指定类型解释值的操作,合法语法为(目标类型)表达式;易出问题的情形包括数值截断、指针乱转和引用类型误转;降低风险需转换前判断、数值校验、避免跨层指针转换及慎用泛型强转;其必要性体现在系统API调用、底层内存操作和性能敏感场景。
强制类型转换,也就是显式转换,是你亲手告诉编译器“请按我说的类型来解释这个值”,而不是让编译器自己猜。它看起来简单,但背后藏着不少容易踩的坑。
基本语法统一为:(目标类型) 表达式。括号不能省,类型名要准确。
(int)3.14、(char*)ptr
(String)obj,但 (String)new Date() 编译直接报错(int)val,但运行时可能抛 InvalidCastException
不是所有强制转换都能安全执行,尤其当类型之间“不搭界”或数值范围不匹配时。
(int)9.99 得到 9,(byte)257 实际存的是 1
void* 强转成 int* 可能没问题,但转成完全无关的结构体指针,一解引用就崩溃(Dog)animal 而 animal 其实是 Cat靠经验不如靠方法。几个实用习惯能避开大部分雷。
instanceof,C# 用 is 或 as(后者失败返回 null)Math.toIntExact(long),溢出会抛异常,比静默截断更可控static_cast 替代 C 风格写法,类型意图更清晰(List<String>)list 编译不通过,只能转原始类型,且带 unchecked 警告它不是设计缺陷,而是必要工具。关键看是不是“不得不”。
LPVOID,你得把 int* 强转过去