Donnerstag, Dezember 12, 2019

In Kotlin, Wie konvertiere ich ein Int? ein Int

Ich bin mit einem HashMap<Int, Int> in Kotlin und wenn ich get der Rückgabetyp ist Int?.

Wie kann ich umwandeln der Int? zu einem Int?

Bisher habe ich versucht, mit Int?.toInt(), aber das scheint wieder ein Int?.

Schreibe ich eine Fibonacci-Funktion, und mein code sieht wie folgt aus:

val fibMemo : Map<Int, Int> = HashMap<Int,Int>()
fun fibN(n:Int) : Int {
    if (n == 0 || n == 1) return 1
    if (fibMemo.containsKey(n))
        //Error here: Type mismatch: inferred type is Int? but Int was expected
        return fibMemo.get(n)?.toInt()
    else {
        val newNum : Int = fibN(n-1) + fibN(n-2)
        fibMemo.put(n, newNum)
        return newNum
    }
}
  • Gibt es neuere Antworten, die den Strom für Kotlin.
  • Diese Frage wird nun beantwortet durch das immer aktuelle und vollständige: stackoverflow.com/questions/34498562 Nach dieser Frage angenommen hat, Antworten und Stimmen, diese sollten geschlossen werden, als doppelte, die. In meta.stackexchange.com eine empfohlene Weg, um zu modernisieren, Fragen und Antworten ist eine neue zu erstellen, und schließen Sie dann das alte, während das hinzufügen einer Referenz auf die neue.
InformationsquelleAutor jjnguy | 2012-03-05

7 Kommentare

  1. 21

    Die direkte Antwort, verwenden Sie die !! operator geltend zu machen, denen Sie Vertrauen, ein Wert, der NICHT null ist und somit Veränderung seiner Art, der nicht null entspricht. Ein einfaches Beispiel zeigt die Behauptung ermöglicht die Konvertierung (und das gilt für alle nullable-Typ, nicht nur Int?)

    val nullableInt: Int? = 1
    val nonNullableInt: Int = nullableInt!! //asserting and smart cast

    Anderen Weg, um zu konvertieren ein Wert wird über ein null-check. Nicht nützlich, im code oben, aber in den anderen code (siehe Null-Bedingungen):

    val nullableInt: Int? = 1
    if (nullableInt != null) {
       //allowed if nullableInt could not have changed since the null check
       val nonNullableInt: Int = nullableInt
    }

    Dieser Fragen wird auch beantwortet durch die idiomatische Behandlung von null-Zulässigkeit Frage: In Kotlin, was die idiomatischen Umgang mit nullable-Werten, verweisen auf oder konvertieren Sie

  2. 8

    Um zu konvertieren eine Int? zu einem Int verwenden Sie die sure() Methode.

    Die betreffende Zeile sollte wie folgt Aussehen:

    return fibMemo.get(n).sure()

    Aufruf der Methode sure() ist Kotlin Weg (bald ersetzt durch spezielle sprachkonstrukt) zu gewährleisten, dass keine null-Zulässigkeit. Als Java hat keine notation der null-und nicht-nullable-Typen, die wir brauchen, zu nehmen einige Sorgfalt auf die integration zeigen. Bitte Lesen Sie die erstaunliche Geschichte der null-Sicherheit in Kotlin-Dokumentation.

    Quelle

    Warnung: die oben genannten Informationen nicht mehr greifen. sure wurde ersetzt durch !!. Siehe: http://blog.jetbrains.com/kotlin/migrating-sure/

    • Übrigens zeigt dieses Beispiel, dass selbst wenn anzeigen.contains(n) ist wahr, in einer multithreaded Umgebung, Karte.man(n) kann als Ergebnis den Wert null.
    • Warum ändern Sie nicht die Antwort zu aktuellen und drop die .sure() Antwort völlig, da ist es völlig falsch für die aktuelle Kotlin.
  3. 2

    Können Sie auch getOrPut Funktion zu vermeiden, enthält/setzen Sie code. Sehen

    val fibMemo = HashMap<Int, Int>()
    fun fibN(n: Int): Int = when {
        n < 0 -> throw IllegalArgumentException("fib is not applicable to $n")
        n == 0, n == 1 -> 1
        else -> fibMemo.getOrPut(n) { fibN(n - 1) + fibN(n - 2) }
    }
  4. 2

    Neben der Prüfung auf das Vorhandensein des Schlüssels, werden Sie auch brauchen, um sicherzustellen, dass der zurückgegebene Wert ist nicht null als java.util.HashMap ermöglicht null Werte.

    Können Sie tun, indem Sie entweder um Ihren Ruf zu get mit einer expliziten null prüfen oder durch aufrufen !! auf den zurückgegebenen Wert.

    Ihre Problemumgehung zu verwenden as Int wird markiert als eine unsichere cast-Warnung, die von der IDEE, und ist daher nicht ratsam.

    • Wie kann ich eine Karte von Int dann? Ich bin immer einfügen von null-Ganzzahlen in die Karte, so sind Sie garantiert nicht-null.
    • Auch ich würde gerne dazu beitragen, die Euler-Projekt und vielleicht vermehren manche verticken die std libs.
    • aktualisiert meine Antwort, sieht es besser?
    • Wie haben Sie wahrscheinlich herausgefunden, ist die Kehrseite der Berufung auf sure() ist, dass Sie verlieren null Sicherheit zur Laufzeit. Da du jedoch sicher sein, dass Sie immer kartierschlüssel nicht null – Werte, sollten Sie voran gehen und verwenden sure() unabhängig.
    • Als für das helfen lösen Project Euler (PE) Probleme, mein Verständnis ist, dass die PE-Website-Administratoren wird dringend davon abgeraten, die Zusammenarbeit und eher die Menschen zu ermutigen, individuell zu erkunden, die mathematischen Konzepte hinter jedem problem.
    • Ich bin nicht daran interessiert, die mathematischen Implikationen der Probleme, (die ich gelöst habe verloren, bevor Sie) ich bin daran interessiert, eine gute Referenz für die Sprache sowie zu Ihrer Entwicklung beitragen.
    • Bitte ersetzen Sie Sie sicher mit !! deine Antwort, da es nicht Teil der Kotlin für die Jahre.

  5. 2

    Der einfachste Weg ist die Verwendung eines null-check

    var a : Int? = 12
    var b : Int      
    b = a //error!
    b = if(a != null) a else -1    //automatic typecast from Int? to Int

    Finden Sie mehr über die null-sichere Typumwandlungen hier : Null Sicherheit – Kotlin

  6. 1

    Die kurze Antwort ist können Sie nicht, es sei denn, Sie nachdrücklich Zustand an den compiler, dass die nullable int können nicht und werden nicht null durch die Verwendung von zwei Ausrufezeichen oder durch die Verwendung eines if statement; denn int ist ein subtype von int?

    Ist hier ein Beispiel.

    val x:Int? = 1
    val y: Int =2
    
    x=y //No error
    y=x //Error
    y=x!! //No error
  7. 1

    Können Sie auch einen default-Wert in null-Fall:

    val int: Int
    val nullableInt: Int? = null
    int = nullableInt ?: 0

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...