Android Kotlin代码中使用java.lang.Iterable#forEach,Lint提示需API24但API23设备可正常运行的问题
为什么Kotlin中Iterable.forEach在API23设备正常运行但Lint报错需要API24?
这是个很常见的Lint误判问题,核心原因在于Kotlin的forEach和Java SDK中的Iterable.forEach根本不是同一个东西,具体拆解如下:
- Java SDK的
Iterable.forEach是API24才引入的:Java 8的默认方法特性在Android API24才被支持,所以java.lang.Iterable自带的forEach确实是API24+的方法。 - 你实际调用的是Kotlin标准库的扩展函数:Kotlin为所有实现了
Iterable接口的类都提供了一个顶层扩展函数forEach,这个函数属于Kotlin标准库(kotlin-stdlib),完全不依赖Android的API版本——哪怕是API21甚至更低,只要你的项目引入了Kotlin标准库,就能正常使用。 - Lint误把Kotlin扩展函数当成了Java SDK方法:Lint的静态检查有时候会混淆Java和Kotlin的方法来源,它看到你调用了
forEach,就默认匹配到Java SDK里那个API24+的方法,从而抛出错误,但实际上你的代码运行时调用的是Kotlin的扩展函数,所以在API23设备上完全没问题。
解决Lint报错的办法
如果你想消除这个错误提示,可以试试以下几种方式:
给该方法添加Lint忽略注解:
在调用forEach的代码所在方法上添加注解:@Suppress("NewApi") fun yourFunction() { mandatoryViews.forEach { view -> // 你的代码 } }或者更精准地忽略特定的Lint检查:
@Suppress("ObsoleteSdkInt")明确指定调用Kotlin的扩展函数:
虽然没必要,但可以显式调用Kotlin的扩展函数来让Lint识别:kotlin.collections.forEach(mandatoryViews) { view -> // 你的代码 }更新Android Gradle Plugin版本:
较新的AGP版本对Kotlin代码的Lint检查更准确,升级到最新稳定版可能会自动修复这个误判问题。
内容的提问来源于stack exchange,提问作者Nitin Verma




