簡體   English   中英

為什么HashMap.get不返回可空類型?

[英]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社區版。

你的變量hmHashMap類型,因為它是一個平台類,它的方法返回平台類型 然而,Kotlin自己的Map及其子 特性 子接口MutableMapget()返回可為空的類型。

將您的代碼更改為

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()簽名,因為Kotlin團隊注釋了JDK類,知道get()返回一個可以為空的值Int? 在這種情況下。

只有這些注釋中的錯誤才會導致問題。 如果您在JDK運行時庫中看到另一個錯誤 ,則應將其作為錯誤進行跟蹤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM