为什么HashMap.get不能返回一个可为空的类型?
我有点惊讶,下面的例子抛出一个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 interop的一个普遍问题?
我正在使用IntelliJ IDEA 14.1 Community Edition和Kotlin 0.11.91.1插件。
你的变量hm
是HashMap
类型的,因为这是一个平台类,它的方法返回平台类型 。 但是Kotlin自己的Map
和它的子接口MutableMap
却返回get()
可空类型。
改变你的代码
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()
都具有相同的签名,因为JDK类由Kotlin团队注释,以知道get()
返回一个可为空的值Int?
在这种情况下。
只有这些注释中的错误才会导致问题。 如果您在JDK运行时库中看到另一个,则应该将其作为错误进行跟踪 。