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

java.util.HashMap是否在Kotlin中实现了java.util.Map?,java,inheritance,language-lawyer,kotlin,Java,Inheritance,Language Lawyer,Kotlin,我很难理解为什么JavaHashMap与Kotlin中的JavaMap不兼容: val map : java.util.Map<Int, Int> = java.util.HashMap<Int, Int>() // ERROR: Type mismatch 我认为,这是一个错误。你可以在那里报告 但是,putIfAbsent仍然是Java8的一个特性,Kotlin还不支持(MutableMap接

我很难理解为什么Java
HashMap
与Kotlin中的Java
Map
不兼容:

val map : java.util.Map<Int, Int> = java.util.HashMap<Int, Int>()
                                    // ERROR: Type mismatch

我认为,这是一个错误。你可以在那里报告


但是,
putIfAbsent
仍然是Java8的一个特性,Kotlin还不支持(
MutableMap
接口缺少此方法)。

在Kotlin中,
Java.util.HashMap
在编译时没有实现
Java.util.Map
,但是实现了
kotlin.collections.MutableMap
,它扩展了只读
kotlin.collections.Map

这是因为科特林的。有关详细信息,请参见中的集合


没有定义任何
putIfAbsent
,但它有一个扩展功能。

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

我还提到,
java.util.HashMap
没有实现
java.util.Map
,但是我把它留给Kotlin开发人员来决定它是一个bug还是编译器拒绝它是正确的


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

您确定吗?我认为运行时不存在
kotlin.MutableMap
?正确。这就是为什么我在回答中写了“编译时”。Kotlin在编译时可用,但在运行时映射到不同的类型。更多关于平台类型和功能的详细信息。我怀疑投票被否决是因为缺少支持这个答案的参考资料。e、 g.如果提供了指向某个问题或相关文档的链接,说明/表明Java集合在Kotlin中未得到特别处理,则某些人可能会认为此答案更有帮助。我个人非常感谢此答案,但我希望它引用了一个具体问题或一些支持它可能是错误的文档。无需为了否决投票,如果这是一个错误,唯一支持的事实就是这种行为的不合逻辑性
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);
    }
}
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
    }
}
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
    }
}