Kotlin映射/列表可空类型安全

Kotlin映射/列表可空类型安全,kotlin,type-safety,Kotlin,Type Safety,我是科特林的新手,所以我的问题需要一些关键词 以下是我的kotlin代码: fun-foo(地图:地图){ 弗雷奇地图{ println(it.value.toString()) } } 当按如下方式调用此代码段时,可能会导致NPE: fun main(){ val map=mapOf(“条”到null)作为映射 富(地图) } 我不知道为什么将mapOf(“bar”转换为null)转换为Map时不会出现编译错误 不知道为什么函数foo在没有编译错误或警告或时会导致NPE 我肯定有类似的问题

我是科特林的新手,所以我的问题需要一些关键词

以下是我的kotlin代码:

fun-foo(地图:地图){
弗雷奇地图{
println(it.value.toString())
}
}
当按如下方式调用此代码段时,可能会导致NPE:

fun main(){
val map=mapOf(“条”到null)作为映射
富(地图)
}
  • 我不知道为什么将mapOf(“bar”转换为null)转换为Map时不会出现编译错误
  • 不知道为什么函数
    foo
    在没有编译错误或警告或
    时会导致NPE
  • 我肯定有类似的问题,但我找不到问题或任何关键词


    实际上我用的是这张地图:

    val objectMapper=jacksonObjectMapper()
    val string=“”
    {“值”:null}
    “.trimIndent()
    //这是一个示例,原始字符串来自RESTAPI输入。
    val convertedMap:Map=objectMapper.readValue(字符串)
    
    它没有发出任何警告,导致了NPE。
    我需要一些使用kotlin映射/列表的技巧,以避免出现意外错误。

    强制转换本质上是不安全的。您告诉编译器您比编译器更了解您正在转换的对象。在一些情况下,编译器可能会在强制转换时给您一个错误,当它可以告诉您正在强制转换一些不可能与其他类型匹配的内容时

    当您强制转换到没有泛型的类时,通常不会得到任何警告。假设它与
    一样如果你是演员,你知道你在做什么。您已经检查了可能的逻辑,并且可以绝对确认强制转换是安全的,即使编译器无法判断

    当您使用泛型强制转换到一个类时,编译器至少会给您一个警告。这是因为如果泛型类型错误,则强制转换不会失败。由于类型擦除,它将成功,然后当您开始与对象交互时,代码中的其他地方将出现错误。因此,出现警告是因为它甚至比ClassCastException更糟糕,因为结果错误发生在代码中的其他地方,而不是执行强制转换的那一行,这使得调试更加困难

    抑制警告只会使警告消失。它根本不会改变行为。只有在检查了警告可能导致的故障并确保所做的操作是安全的情况下,才能抑制警告


    对于您的映射,将其强制转换为不可为null的值(尽管它包含null值)将在运行时成功,但在稍后检索值时失败。

    您将收到一条警告,告诉您这是一个不安全的强制转换。尽管
    readValue
    具有
    suppressWarnings
    ,但我附加了我的无警告案例。。