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
接口缺少这种方法)中还不支持。