Kotlin警告:条件分支结果的types是隐含的任何吗?

我有“types的条件分支结果是Any的暗示性演员? 警告当我尝试做这样的事情:

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) } 

但最后它的工作。 我的代码有什么问题吗? 有没有可能删除这个警告?

编辑(作为@ Xavier布克莱特建议 – 警告消失)

 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) } 

警告告诉你,你已经在你的分支中返回了不同的types,并且你分配的variables将被推断为它们的第一个常见的超types,在这种情况下是Any? 。 这不是您通常使用if-elseexpression式的方式,您通常会从两个分支中返回相同的types。 IDE警告你,因为你所做的事通常是偶然的。

如果你打算在后面检查你使用的实际types的结果types,那么你的代码很可能没问题。

要删除警告,您可以通过注释来取消警告:

 @Suppress("IMPLICIT_CAST_TO_ANY") val chatObject = ... 

或者明确指出if-elseexpression式返回的types是未知的:

 val chatObject: Any = ...