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

时间:2015-12-13 19:29:06

标签: java inheritance language-lawyer kotlin

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

3 个答案:

答案 0 :(得分:14)

在Kotlin中,java.util.HashMap在编译时没有实现java.util.Map,而是实现扩展了只读kotlin.collections.MutableMap的{​​{1}}。

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

MutableMap未定义任何kotlin.collections.Map,但它有一个扩展函数getOrPut

答案 1 :(得分:3)

我创建了一个错误报告,主要是针对“Java to Kotlin”转换器,它在我的原始示例中生成了无效的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)。

答案 2 :(得分:0)

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

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