Kotlin警告:类型的条件分支结果是Any的隐含性?

Leś*_*icz 5 warnings casting kotlin

我有"类型的条件分支结果......是任意的隐形演员?" 当我尝试做这样的事情时发出警告:

objects?.forEach {

     val gson = Gson()

     val chatObject = if(it.type == CHAT_TEXT_TYPE) gson.fromJson(it.value, ChatText::class.java)  //WARNING
                      else gson.fromJson(it.value, ChatProduct::class.java) //WARNING

     //TEST
     if(chatObject is ChatText) Log.e("ChatText: It works!", chatObject.text)
     if(chatObject is ChatProduct) Log.e("ChatProduct: It works!", chatObject.name)
}
Run Code Online (Sandbox Code Playgroud)

但最后它的确有效.我的代码有什么问题吗?是否有可能删除此警告?

编辑(正如@Xavier Bouclet建议的那样 - 警告消失了)

val chatObject = when (it.type)
            {
                CHAT_TEXT_TYPE ->  gson.fromJson(it.value, ChatText::class.java)
                CHAT_PRODUCT_TYPE -> gson.fromJson(it.value, ChatProduct::class.java)
                else -> gson.fromJson(it.value, Any::class.java)
            }
Run Code Online (Sandbox Code Playgroud)

zsm*_*b13 8

警告告诉您,您已经在分支中返回了不同的类型,并且您要分配的变量将被推断为它们的第一个常见超类型,在这种情况下是Any?.这不是您通常使用if-else表达式的方式,通常从两个分支返回相同的类型.IDE正在警告你,因为你正在做的事情通常是偶然的.

如果你打算稍后检查你正在使用的实际类型的结果类型,你可能对你的代码很好.

要删除警告,您可以使用注释来禁止警告:

@Suppress("IMPLICIT_CAST_TO_ANY")
val chatObject = ...
Run Code Online (Sandbox Code Playgroud)

或者明确声明if-else表达式返回的类型是未知的:

val chatObject: Any = ...
Run Code Online (Sandbox Code Playgroud)