2017-11-13 16 views
0

私は "タイプの条件分岐結果は...何のimplicity castですか?"このようなことをしようとすると警告します。Kotlin警告:タイプの条件分岐結果は、暗黙のキャスト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 - 警告は、あなたの枝に異なる種類を返されたことを言っている、とあなたが代入している変数はに推測されること

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

が、私は警告を推測

あなたはコメントで警告を抑制するか、警告を削除するにはAnyのキャストを処理するように指示します。三番目のif。いつ使用するか検討してください。 –

答えて

2

(@Xavier Boucletが示唆したように警告が消えました)最初の一般的なスーパータイプであり、この場合はAny?です。これは通常、式if-elseを使用する方法ではなく、通常は両方のブランチから同じタイプを返します。あなたがやっていることは通常偶然であるため、IDEはあなたに警告しています。

とにかく使用している実際のタイプの結果のタイプを後で確認する場合は、おそらくコードで問題ありません。

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

するか、明示的にif-else式が返すタイプが不明であると述べている:

val chatObject: Any = ... 
関連する問題