我无法理解为什么Java HashMap
与Kotlin中的Java Map
不兼容:
val map : java.util.Map<Int, Int> = java.util.HashMap<Int, Int>()
// ERROR: Type mismatch
这是一个错误还是故意在Kotlin中强制执行错误?
这是Java to Kotlin编译器的第二个例子。看一下这个Java示例文件:
public class Test {
public static void main(String[] args) {
java.util.Map<Integer, Integer> map = new java.util.HashMap<>();
insertValue(map);
}
private static void insertValue(java.util.Map<Integer, Integer> map) {
map.putIfAbsent(0, 1);
}
}
运行“将Java转换为Kotlin”会产生以下文件:
object Test {
@JvmStatic fun main(args: Array<String>) {
val map = java.util.HashMap<Int, Int>()
insertValue(map)
}
private fun insertValue(map: Map<Int, Int>) {
map.putIfAbsent(0, 1) // ERROR! Unresolved reference
}
}
如果我尝试修改它以反映更多原始文件,insertValue
期望Java java.util.Map
,我会收到另一个错误:
object Test {
@JvmStatic fun main(args: Array<String>) {
val map = java.util.HashMap<Int, Int>()
insertValue(map) // ERROR: Type mismatch
}
private fun insertValue(map: java.util.Map<Int, Int>) {
map.putIfAbsent(0, 1) // is now OK
}
}
答案 0 :(得分:14)
在Kotlin中,java.util.HashMap
在编译时没有实现java.util.Map
,而是实现扩展了只读kotlin.collections.MutableMap
的{{1}}。
这是因为Kotlin的mapped types。有关详细信息,请参阅Kotlin M3 is Out!中的收藏集。
MutableMap
未定义任何kotlin.collections.Map
,但它有一个扩展函数getOrPut
。
答案 1 :(得分:3)
我创建了一个错误报告,主要是针对“Java to Kotlin”转换器,它在我的原始示例中生成了无效的Kotlin代码:
我还提到java.util.HashMap
没有实现java.util.Map
但我将它留给Kotlin开发人员来决定它是否是一个错误或编译器拒绝它是否正确。
更新:错误标记为已解决(提交5e231db6)。
答案 2 :(得分:0)
我想,这是一个错误。你可以在那里报告 https://youtrack.jetbrains.com/issues/KT
但是,putIfAbsent
仍然是Java 8的功能,Kotlin尚未支持(MutableMap
接口缺少此方法)。