为什么 HashMap.get 不是 return 可空类型?

Why does HashMap.get not return a nullable type?

我有点惊讶以下示例抛出 NullPointerException:

fun main(args: Array<String>) {
    val hm = HashMap<String, Int>()
    hm.put("alice", 42)
    val x = hm.get("bob")
    println(x)   // BOOM
}

我以为 Kotlin 代码中没有 NullPointerException

如果我用可选类型注释 x,程序会打印 null

fun main(args: Array<String>) {
    val hm = HashMap<String, Int>()
    hm.put("alice", 42)
    val x: Int? = hm.get("bob")
    println(x)   // null
}

我是否发现了一个特例,或者这是 Kotlin/Java 互操作的普遍问题?

我正在使用带有 Kotlin 0.11.91.1 插件的 IntelliJ IDEA 14.1 社区版。

您的变量 hmHashMap 类型,因为这是一个平台 class 它的方法 return platform types. Kotlin's own Map and its subtrait subinterface MutableMap however return nullable types for get().

将代码更改为

val hm : MutableMap<String, Int> = HashMap()

它将打印 "null".

这不再是问题。 Kotlin 对如何注释 JDK class 告诉它如何处理某些方法有疑问。当前的 Kotlin 没有出现您所看到的问题。

这两个 return 来自 Java 个集合的 HashMap,第一个 hm1 更符合习惯。

val hm1 = hashMapOf<String, Int>()
val hm2 = HashMap<String, Int>()

您也可以将其创建为已有值的地图,前提是这些值是提前知道的。

val hm3 = hashMapOf("alice" to 42)

或只读版本:

val hm4 = mapOf("alice" to 42)

在所有这些版本中,它们都在使用未知值调用 get() 然后打印结果时打印 null

println(hm1.get("missing"))
println(hm2.get("missing"))
println(hm3.get("missing"))
println(hm4.get("missing"))

所有 get() 都具有相同的签名,因为 Kotlin 团队对 JDK class 进行了注释,以了解 get() return 是可为空的值,在本例中为 Int?

只有那些注释中的错误才会导致问题。如果您在 JDK 运行时库中看到另一个,则应该是 tracked as a bug