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

2022-09-03 14:25:39

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

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
    }
}

如果我尝试修改它以反映更多的原始文件,其中需要Java,我得到另一个错误:insertValuejava.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
    }
}

答案 1

在 Kotlin 中,在编译时,a 不实现 ,而是实现扩展只读 。java.util.HashMapjava.util.Mapkotlin.collections.MutableMapkotlin.collections.Map

这是因为 Kotlin 的映射类型。请参阅 Kotlin M3 中的 Collections is Out! 了解更多详情。

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


答案 2

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

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

我还提到它没有实现,但我把它留给Kotlin开发人员来决定它是否是一个错误,或者编译器拒绝它是否正确。java.util.HashMapjava.util.Map

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


推荐