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

时间:2018-01-25 07:06:34

标签: java android collections kotlin

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

private val uris: MutableMap<String, Uri> = 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 for Android项目。但是为什么lint将它视为JDK-8的Map?

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

那么可能是什么原因以及如何解决这个问题?任何领导都将不胜感激。

3 个答案:

答案 0 :(得分:6)

foreach上有两个重载的Map

Kotlin一:

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

Java8 one:

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

令人困惑,不是吗?

答案 1 :(得分:1)

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

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

您还可以查看此博客:

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

答案 2 :(得分:0)

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

如果您使用Kotlin forEach但仍有此警告,则应将此问题报告给Android Issue Tracker