Предупреждение Котлина: Условный результат ветви типа … – это импликация любого?

У меня есть «Условный результат ветви типа … – это бессмысленность, отличная от 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) } 

Но, наконец, это работает. Что-то не так с моим кодом? Можно ли удалить это предупреждение?

EDIT (как предложил @ 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) } 

Предупреждение сообщает вам, что вы вернули разные типы в своих филиалах и что переменная, которую вы назначаете, будет считаться их первым общим супертипом, который в этом случае является Any? , Это не так, как вы обычно используете выражение if-else , вы обычно возвращаете тот же тип из обеих ветвей. IDE предупреждает вас, потому что то, что вы делаете, обычно бывает случайным.

Если вы захотите проверить тип результата позже для реальных типов, которые вы используете, вы, вероятно, хорошо разбираетесь в коде.

Чтобы удалить предупреждение, вы можете либо подавить предупреждение с комментариями:

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

Или явно укажите, что тип, возвращаемый выражением if-else , неизвестен:

 val chatObject: Any = ...