Die Typprüfung ist in kotlin auf eine Rekursion gestoßen

Lesezeit: 3 Minuten

Benutzer-Avatar
Ankur_009

 val cycleRunnable = Runnable {
        handler.postDelayed(cycleRunnable,100)
    }

Ich erhalte den Fehler Error:(219, 29) Bei der Typprüfung ist ein rekursives Problem aufgetreten. Einfachste Problemumgehung: Geben Sie die Typen Ihrer Deklarationen explizit an

Aber seine genaue Java-Version hat keinen Fehler

private final Runnable cycleRunnable = new Runnable() {
        public void run() {
                handler.postDelayed(cycleRunnable, POST_DELAY);
        }
    };

  • Ich nehme an, Sie können so etwas wie einen Objektausdruck machen val runnable = object : Runnable { . . . Bearbeiten Was Holi-Java gesagt hat.

    – ZarMatt

    1. August 2017 um 16:22 Uhr


Benutzer-Avatar
Hotkey

Kotlin verbietet die Verwendung einer Variablen oder einer Eigenschaft innerhalb seines eigenen Initialisierers.

Sie können eine verwenden Objektausdruck implementieren Runnable genauso wie in Java:

val cycleRunnable = object : Runnable {
    override fun run() {
        handler.postDelayed(this, 100)
    }
}

Eine andere Möglichkeit, dies zu tun, besteht darin, eine Funktion zu verwenden, die die zurückgibt Runnable und zu verwenden cycleRunnable innerhalb des daran übergebenen Lambda, zB:

val cycleRunnable: Runnable = run {
    Runnable {
        println(cycleRunnable)
    }
}

Oder sehen Sie sich eine Problemumgehung an, die es ermöglicht, eine Variable innerhalb ihres eigenen Initialisierers durch eine Selbstreferenz zu verwenden:

Dieser Code funktioniert nicht sofort: Sie müssen die Dienstprogramme über den obigen Link hinzufügen oder die verwenden kotlin-fun Bibliothek:

val cycleRunnable: Runnable = selfReference {
    Runnable {
        handler.postDelayed(self, 100)
    }
}

  • Wenn Kotlin die Verwendung einer Variablen innerhalb seines eigenen Initialisierers verbietet, würde der Fehler dies dann nicht sagen? Der Fehler besagt eindeutig etwas anderes und bietet auch eine Problemumgehung.

    – Rohan Bhatia

    20. Januar 2018 um 15:38 Uhr

  • Nur die Diagnose ist in diesem Fall nicht eindeutig genug. Es gibt zwei Fehler im fraglichen Code, und der Compiler meldet den über rekursive Typen (er kann auch in vielen anderen Fällen auftreten). Sobald Sie es behoben haben, wird es sagen, dass die Variable initialisiert werden muss, und das habe ich in meiner Antwort beschrieben.

    – Hotkey

    20. Januar 2018 um 16:14 Uhr

Für jeden, der diese Compiler-Warnung sieht, kann es so einfach sein, Ihren Code in a zu verschachteln Unit auch bekannt { ... }

Mit Kotlin können wir Funktionen zuweisen:

fun doSomethingElse() = doSomething()
fun doSomething() { }

Dies funktioniert jedoch nicht, wenn wir die Funktion rekursiv aufrufen:

fun recursiveFunction(int: Int) =
    when (int) {
        1 -> { }
        else -> recursiveFunction()
    }

Die Lösung ist einfach:

fun recursiveFunction(int: Int) {
    when (int) {
        1 -> { }
        else -> recursiveFunction()
    }
}

  • Deine Lösung hat bei mir funktioniert. Ich konnte jedoch am Ende einen Ausdruckskörper verwenden, indem ich den Rückgabetyp explizit definierte.

    – Meisterwok

    21. August 2018 um 2:56 Uhr

  • Es ist das zweite Mal, dass ich Ihre Antwort auf Google gefunden und mir geholfen habe. Ich hoffe nicht wieder vergessen 🙂

    – Vahid

    10. Februar 2021 um 6:16 Uhr

Benutzer-Avatar
Axbor Axrorow

Zeigen Sie den Werttyp explizit wie unten an:

val cycleRunnable:Runnable = Runnable {
    handler.postDelayed(cycleRunnable,100)
}

Diese Lösung löst die meisten Probleme mit der rekursiven Typprüfung.

Wenn Sie einen Fehler erhalten Variable must be initialized dann müssen Sie zuerst die Variable deklarieren und sie dann wie folgt mit Runnable initialisieren:

lateinit var cycleRunnable:Runnable

//in constructor or somewhere else:
cycleRunnable = Runnable {
        handler.postDelayed(cycleRunnable,100)
    }

  • Diese Lösung funktioniert nicht. Ja, der ursprüngliche Fehler (Typprüfung ist auf ein rekursives Problem gestoßen) wird nicht mehr angezeigt, sondern ein neuer Fehler (Variable ‘cycleRunnable’ muss initialisiert werden)

    – Kenneth Argo

    9. Januar 2020 um 3:51 Uhr

  • @KennethArgo welche Kotlin-Version verwendest du? Es ist unmöglich, einen solchen Fehler zu erhalten, da wir diesen Wert initialisieren.

    – Axbor Axrorow

    9. Januar 2020 um 6:39 Uhr


  • Ich habe immer die neueste Version verwendet: 1.3.61

    – Kenneth Argo

    4. Februar 2020 um 23:10 Uhr

  • @KennethArgo Danke, ich sehe, dass in den neuesten Versionen solche Probleme auftreten. Ich habe meine Antwort aktualisiert.

    – Axbor Axrorow

    5. Februar 2020 um 13:17 Uhr

Benutzer-Avatar
Holi-Java

Wie wäre es damit? Sie können es durch ersetzen Objektausdruckdas liegt daran, dass Sie nicht auf das Lambda im Lambda-Körper verweisen können, da die cycleRunnable wurde noch nicht initialisiert.

val cycleRunnable = object:Runnable {
    override fun run() {
        handler.postDelayed(this, 100)
    }
}

ODER benutze die faul Delegierte Eigenschaften stattdessen, wenn die cycleRunnable ist eine Eigenschaft, zum Beispiel:

val cycleRunnable: Runnable by lazy {
    Runnable { handler.postDelayed(cycleRunnable, 100) }
}

1039430cookie-checkDie Typprüfung ist in kotlin auf eine Rekursion gestoßen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy