【问题标题】:Does java.util.HashMap not implement java.util.Map in Kotlin?java.util.HashMap 没有在 Kotlin 中实现 java.util.Map 吗?
【发布时间】:2016-03-19 05:49:46
【问题描述】:

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

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

这是一个错误,还是故意强制成为 Kotlin 中的一个错误?


这是 Java 到 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);
    }
}

运行“Convert Java to 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
    }
}

【问题讨论】:

    标签: java inheritance language-lawyer kotlin


    【解决方案1】:

    在 Kotlin 中,java.util.HashMap 在编译时不会实现 java.util.Map,但会实现 kotlin.collections.MutableMap,它扩展了只读的 kotlin.collections.Map

    这是因为 Kotlin 的 mapped types。有关详细信息,请参阅Kotlin M3 is Out! 中的Collections

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

    【讨论】:

    • 你确定吗?我以为kotlin.MutableMap在运行时不存在?
    • 正确。这就是为什么我在回答中写了“在编译时”。 Kotlin 的 mapped types 在编译时可用,但在运行时映射到不同的类型。有关平台类型herehere 的更多详细信息。
    【解决方案2】:

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

    KT-10400 Java to Kotlin converter: converting Java Code where a java.util.HashMap is accessed through the java.util.Map interface fails

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

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

    【讨论】:

    • 我仍然遇到 kotlin 1.5.30 中的错误
    【解决方案3】:

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

    但是,putIfAbsent 仍然是 Java 8 的功能,Kotlin 尚不支持(MutableMap 接口缺少此方法)。

    【讨论】:

    • 我怀疑否决票是因为缺乏支持这个答案的参考资料。例如如果提供了指向问题的链接或有关 calling Java from Kotlin 的相关文档的链接,说明/表明 Java 集合在 Kotlin 中没有得到特殊处理,则此答案可能会被某些人认为更有帮助。
    • 我个人很欣赏这个答案,但我希望它引用了一个具体问题或一些支持它可能是一个错误的文档。
    • 不需要投票,如果这是一个错误,唯一支持的事实就是这种行为的不合逻辑
    猜你喜欢
    • 2011-08-13
    • 1970-01-01
    • 2010-12-19
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2012-11-07
    相关资源
    最近更新 更多