Lint认为Kotlin MutableMap.forEach()是java.util.Map.forEach()

我在Android项目中使用Kotlin的MutableMap。 并试图做一些行动每个项目。 所以这里是我的代码。

private val uris: MutableMap = mutableMapOf() // ... Fill the items here ... uris.forEach { val ref = FirebaseFirestore.getInstanse().reference uploadFile(ref, it.value) } 

在运行时,一切正常,但我的CI构建失败,下面的lint错误:

 MyActivity.kt:142: Error: Call requires API level 24 (current min is 16): java.util.Map#forEach [NewApi] uris.forEach { ~~~~~~~ 

我知道在min sdk是24之前我们不能使用JDK-8的Map项目。但是为什么lint会把它看作是JDK-8的Map?

有关更多信息,我尝试从AS中的Kotlin Bytecode选项获取Java代码,并发现forEach按预期方式被替换为while循环和迭代器。

那么可能是什么原因以及如何解决呢? 任何主角将不胜感激。

我认为这是一个import问题。 也许你已经使用了JDK 8的Map.forEach

你必须使用kotlin.collections.MutableMap.forEach

你也可以查看这个博客:

http://blog.danlew.net/2017/03/16/kotlin-puzzler-whose-line-is-it-anyways/

Map上有两个重载的foreach

科特林一:

 uris.forEach { (key, value) -> // Do some Action } 

Java8之一:

 uris.forEach { key, value -> // Do some Action } 

混乱,不是吗?

你确定从Kotlin使用forEach吗? 因为有两个forEach ,一个来自Kotlin, Map.Entry作为参数,一个来自Java,带有两个参数:key和value。 请显示完整版本的代码。 如果你使用forEach没有参数,这意味着你使用Kotlin一个(你有it隐含的参数)。

如果您使用Kotlin forEach并仍然存在此警告,则应将此问题报告给Android问题跟踪器