为什么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插件。

你的变量hmHashMap类型的,因为这是一个平台类,它的方法返回平台类型 。 但是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运行时库中看到另一个,则应该将其作为错误进行跟踪 。

Interesting Posts