2017-10-31 4 views
0

私はアンドロイドスタジオinbuiltファイルコンバータを使用してJavaファイルをkotlinに変換しました。以下のエラーが表示されます。kotlinでインスタンスエラーが発生する: 'タイプ'へのスマートキャストが不可能

[SMARTCAST_IMPOSSIBLE]「ReminderRequester」へのスマートキャストが 「ReminderRequesterは」

私のコードスニペットは、以下の通りである。この時点で が変更されている可能性も変更可能なプロパティがあるので、不可能です。

private var sReminderInstance: ReminderRequester? = null 

    val instance: ReminderRequester 
     get() { 
      if (sReminderInstance == null) { 
       sReminderInstance = ReminderRequester() 
      } 
      return sReminderInstance; // ERROR: Smart cast to 'ReminderRequester' is impossible, because 'ReminderRequester' is a mutable property that could have been changed by this time 
     } 

私は同様のタイプの質問をチェックしましたが、正しく理解できません。

上記のエラーの意味とその修正方法を教えてください。

+0

キーワードに一致するようにプロパティの種類を変更** val **は変数が不変(変更不可)であることを意味します。それを** var ** – NSimon

+0

に変更してください 'return sReminderInstance !!' – Les

+0

@ NSimonコメントありがとうございます。私はそれをvarに変更したとき。その行に "[MUST_BE_INITIALIZED]プロパティを初期化しなければならない"というエラーが表示されます。 –

答えて

1

あなたが見ているエラーは、ReminderRequesterReminderRequester?と同じではないためです。 sReminderInstance!!を使用すると、nullableでないオブジェクトにnullableをキャストすることになり、nullにならないことをコンパイラに保証します(ただし、間違っている可能性があります)。

...スマートは「ReminderRequester」にキャストすることは不可能である、...

は、このエラーがreturnのステートメントで発生している、とあなたがのIntelliJ IDEAを使用している場合は、下の赤いインジケータがありますsReminderInstance。エラーメッセージは一種の弱いですが、戻り値の型がReminderRequester(nullableではない型)の関数(get())からsReminderInstanceに変更されているため、コンパイラは返された変数をReminderRequesterにキャストする必要があります。しかし、私が言ったように、sReminderInstanceReminderRequesterではありません(それはReminderRequester?すなわちヌル可能なタイプです)。

変換されたJavaコードでこのエラーが多く発生します。あなたがnull変数を扱うのに使用されている場所では、null値の型に変換されることがよくあります。場合によっては、ヌルであるかどうかをチェックするだけで、ヌル可能でないものとして使用する前に動作します。これは「スマートキャスト」と呼ばれています。コンパイラは、スレッドがスマートキャストを無効にする可能性があると判断し、それを許可しません(この場合、スレッディングが問題ではないと確信している場合は!!を使用できます)。要約すると

上記のエラーとどのようにそれを修正するの意味は何ですか?

コンパイラが「スマートキャスト」を試みたことを意味します。 「スマートキャスト」は、null可能な型をnull不可能な同等の型に変換しようとする際の用語です。変数がnullかどうかをチェックしても、スマートキャストは常に許可されるとは限りません。修正するには、通常、キャストされる変数に!!を適用します。

+0

あなたの答えと完璧な説明に感謝します。 –

2

2ソリューション

1)

return sReminderInstance!!; 

2プロパティと同じ型を持つように戻り値の型を強制的に)戻り値の型

val instance: ReminderRequester? 
+0

@Semuelあなたの答えをありがとう。 –

関連する問題