繁体   English   中英

为什么HashMap.get不返回可空类型?

[英]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类型,因为它是一个平台类,它的方法返回平台类型 然而,Kotlin自己的Map及其子 特性 子接口MutableMapget()返回可为空的类型。

将您的代码更改为

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

它将打印“null”。

这不再是一个问题。 Kotlin对如何注释JDK类有一个问题,告诉它如何处理一些方法。 目前Kotlin没有出现您所看到的问题。

这些都从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类,知道get()返回一个可以为空的值Int? 在这种情况下。

只有这些注释中的错误才会导致问题。 如果您在JDK运行时库中看到另一个错误 ,则应将其作为错误进行跟踪

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM