为什么 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 社区版。
您的变量 hm
是 HashMap
类型,因为这是一个平台 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。
我有点惊讶以下示例抛出 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 社区版。
您的变量 hm
是 HashMap
类型,因为这是一个平台 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。