我有"类型的条件分支结果...是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 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)
}
答案 0 :(得分:7)
警告告诉您,您已经在分支中返回了不同的类型,并且您推荐的变量将被推断为他们的第一个常见超类型,在这种情况下为{{1} }。这不是您通常使用Any?
表达式的方式,通常从两个分支返回相同的类型。 IDE正在警告您,因为您正在做的事情通常是偶然的。
如果您要稍后检查结果的类型,无论如何都要使用的实际类型,您的代码可能还不错。
要删除警告,您可以使用注释来禁止警告:
if-else
或明确声明@Suppress("IMPLICIT_CAST_TO_ANY")
val chatObject = ...
表达式返回的类型未知:
if-else