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)
@jaysonval 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"))