为什么在Kotlin中使用is运算符会出现「类型不兼容」错误
两种写法的差异与报错原因
这是Kotlin静态类型检查机制的正常表现,核心差异是两种场景下变量的编译期确定类型不同:
- 当你把各类数值存入
List<Any>时,所有元素都会在编译期向上转型为Any类型,遍历得到的每个元素编译期类型都为Any。Any是Kotlin所有类型的根父类,和Int、Long等类型不存在类型互斥关系,因此编译期不会拦截is运算符判断,实际类型校验会推迟到运行时执行。 - 当你直接对推断为
Int类型的num2做is Long判断时,编译期已经明确知道num2的固定类型为Int,而Kotlin类型系统中Int和Long是平级的、完全互不兼容的独立类型(二者都继承自Number但无父子继承关系),编译器可以100%确定该判断永远为false,属于无意义的无效代码,因此直接抛出编译错误。
补充:如果确实需要对固定编译类型的变量做跨类型校验,可以先手动将变量向上转型为
Any再判断,例如(num2 as Any) is Long,该写法可正常通过编译,运行时返回结果为false。
内容的提问来源于stack exchange,提问作者Patrick Dennis
相关产品推荐
相关产品推荐

