You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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报错的办法

如果你想消除这个错误提示,可以试试以下几种方式:

  1. 给该方法添加Lint忽略注解
    在调用forEach的代码所在方法上添加注解:

    @Suppress("NewApi")
    fun yourFunction() {
        mandatoryViews.forEach { view -> 
            // 你的代码
        }
    }
    

    或者更精准地忽略特定的Lint检查:

    @Suppress("ObsoleteSdkInt")
    
  2. 明确指定调用Kotlin的扩展函数
    虽然没必要,但可以显式调用Kotlin的扩展函数来让Lint识别:

    kotlin.collections.forEach(mandatoryViews) { view ->
        // 你的代码
    }
    
  3. 更新Android Gradle Plugin版本
    较新的AGP版本对Kotlin代码的Lint检查更准确,升级到最新稳定版可能会自动修复这个误判问题。

内容的提问来源于stack exchange,提问作者Nitin Verma

火山引擎 最新活动