我在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循环和迭代器。
那么可能是什么原因以及如何解决这个问题?任何领导都将不胜感激。
答案 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