2017-10-31 1 views
0

Ich habe Java-Datei zu Kotlin mit Android Studio eingebaut Dateikonverter konvertiert. Es zeigt unten Fehler an.Get instance error in kotlin: Smartcast zu "type" ist unmöglich

[SMARTCAST_IMPOSSIBLE] Smart-cast 'ReminderRequester' ist unmöglich, weil 'ReminderRequester' ist ein veränderliches Eigenschaft, die dieser Zeit

Mein Code-Schnipsel wie unten verändert worden sein könnte.

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 
     } 

Ich habe ähnliche Art der Frage überprüft, aber ich kann es nicht richtig verstehen.

Was ist die Bedeutung des obigen Fehlers und wie man es beheben kann?

+0

das Stichwort übereinstimmen ** val ** bedeutet, dass die Variable unveränderlich ist (kann nicht geändert werden). Ändern Sie es in ** var ** – NSimon

+0

verwenden 'Return sReminderInstance !!' – Les

+0

@NSimon Danke für den Kommentar. Wenn ich es in Var geändert habe. Es zeigt Fehler als "[MUST_BE_INITIALIZED] Eigenschaft muss in dieser Zeile initialisiert werden". –

Antwort

1

Der Fehler, den Sie sehen, ist, weil ReminderRequester nicht dasselbe ist wie ReminderRequester?. Wenn Sie sReminderInstance!! verwenden, werden Sie gewissermaßen ein NULL-Zeichen an ein nicht nullbares Objekt übergeben, was dem Compiler garantiert, dass es nie null sein wird (aber Sie könnten falsch liegen).

... Smart-cast 'ReminderRequester' ist unmöglich, ...

Dieser Fehler auf der return Anweisung auftritt, und wenn Sie IDEA verwenden IntelliJ, gibt es eine rote Anzeige unter sReminderInstance. Die Fehlermeldung ist eine Art schwach, aber das bedeutet, dass der Compiler die zurückgegebene Variable in ReminderRequester umwandeln muss, da Sie sReminderInstance von einer Funktion (get()), die einen Rückgabetyp ReminderRequester (ein nicht nullable Typ) hat, drehen. Aber, wie ich schon sagte, sReminderInstance ist kein ReminderRequester (es ist ein ReminderRequester?, d. H. Ein Nullable Typ).

Sie werden diesen Fehler in konvertierten Java-Code sehr oft sehen. Wo immer Sie auch mit Nullvariablen arbeiten, werden sie oft in nullbare Typen umgewandelt. Manchmal wird nur überprüft, ob es null ist, bevor Sie es als Nicht-Nullable verwenden. Das nennt man eine "intelligente Besetzung". In anderen Fällen betrachtet der Compiler das Threading als den Smart Cast ablehnend und verbietet es (in diesem Fall können Sie das !! verwenden, wenn Sie sicher sind, dass Threading kein Problem darstellt).

Zusammengefasst

Welche Bedeutung der oben genannten Fehler ist und wie man es beheben?

Dies bedeutet, dass der Compiler einen "Smartcast" versucht hat. "Smartcast" ist die Terminologie für das Konvertieren eines Nullable-Typs in sein nicht nullbares Äquivalent. Smartcast wird nicht immer zulässig sein, obwohl Sie überprüft haben, ob die Variable null ist. Um dies zu beheben, wenden Sie normalerweise !! auf die zu konvertierende Variable an.

+0

Danke für Ihre Antwort und perfekte Erklärung. –

2

2 Lösungen

1) Zwingen Sie den Typ Rückkehr

return sReminderInstance!!; 

2) Ändern Sie den Objekttyp den gleichen Typ wie die Eigenschaft zu haben, den Rückgabetyp

val instance: ReminderRequester? 
+0

@Semuel Danke für Ihre Antwort. –