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

Nullpointerexception 为什么HashMap.get不返回可为空的类型?,nullpointerexception,null,kotlin,java-collections-api,java-interop,Nullpointerexception,Null,Kotlin,Java Collections Api,Java Interop,下面的示例抛出了一个NullPointerException,这让我有点惊讶: fun main(args: Array<String>) { val hm = HashMap<String, Int>() hm.put("alice", 42) val x = hm.get("bob") println(x) // BOOM } 我是否发现了一个特例,或者这是Kotlin/Java互操作的一般问题 我正在使用IntelliJ IDE

下面的示例抛出了一个
NullPointerException
,这让我有点惊讶:

fun main(args: Array<String>) {
    val hm = HashMap<String, Int>()
    hm.put("alice", 42)
    val x = hm.get("bob")
    println(x)   // BOOM
}
我是否发现了一个特例,或者这是Kotlin/Java互操作的一般问题


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

您的变量
hm
属于
HashMap
类型,因为这是一个平台类,所以它的方法返回。但是,Kotlin自己的子接口及其subtrait子接口为返回可为空的类型

将代码更改为

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

它将打印“null”。

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

它们都从Java集合返回一个HashMap,第一个
hm1
更加惯用

val hm1 = hashMapOf<String, Int>()
val hm2 = HashMap<String, Int>()
或只读版本:

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运行时库中看到另一个,则应该是。

为什么要将
trait
替换为
interface
?文档上说的是
trait
。表示“trait”将被弃用,取而代之的是“interface”。这个代码示例应该是:
val hm=hashMapOf()
或者在示例中创建只读的映射
val hm=mapOf(“alice”到42)
@jayson
val hm=hashMapOf()
将再次创建类型为
HashMap
的变量,不是
MutableMap
这就是重点。我想我应该把这个评论说得更清楚。这不是Kotlin目前的问题,当时是一个bug,现在你可以做他最初做的或者我给出的两个例子。请参阅另一个答案中的完整注释。阅读更多有关使用的信息,在提出问题时,这是一个bug,不再是问题。
val hm4 = mapOf("alice" to 42)
println(hm1.get("missing"))
println(hm2.get("missing"))
println(hm3.get("missing"))
println(hm4.get("missing"))