java.util.HashMap是否没有在Kotlin中实现java.util.Map?

我无法理解为什么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 } } 

在Kotlin中, java.util.HashMap在编译时并没有实现java.util.Map ,而是实现了扩展只读kotlin.collections.Map

这是因为Kotlin的映射类型 。 请参阅Kotlin M3中的 收藏集已 停用! 更多细节。

MutableMap没有定义任何putIfAbsent ,但是它有一个扩展函数getOrPut

我创建了一个bug报告,主要针对在我的原始示例中生成无效的Kotlin代码的“Java to Kotlin”转换器:

KT-10400 Java到Kotlin转换器:通过java.util.Map接口访问java.util.HashMap的Java代码转换失败

我还提到java.util.HashMap没有实现java.util.Map但是我把它留给了Kotlin开发者来决定它是一个bug还是编译器是否拒绝它。

更新:该错误被标记为已解决(提交5e231db6 )。

我认为,这是一个错误。 你可以在那里报告https://youtrack.jetbrains.com/issues/KT

但是, putIfAbsent仍然是Java 8的一个特性,在Kotlin( MutableMap接口缺少这种方法)中还不支持。