Der Operator as in Kotlin wird zur expliziten Typumwandlung verwendet. Es gibt zwei Varianten: as und as?. Der erste wirft eine Ausnahme, der zweite ist sicherer. Dieses Werkzeug ist wichtig für die Arbeit mit Polymorphismus sowie für die Migration von Daten und die Interaktion mit externen APIs.
In Java wird bei der Typumwandlung der Cast-Operator (TargetType)obj verwendet, der bei einem Fehler mit ClassCastException abstürzt. Kotlin hat dieses Konzept weiterentwickelt, indem es einen sicheren Cast (as?) hinzugefügt hat, was eine bequemere und explizitere Verwaltung von Nullbarkeit und Laufzeiterros ermöglicht hat.
Eine strenge Typumwandlung in einem großen Projekt ist gefährlich: Wenn der Typ nicht übereinstimmt, stürzt das Programm ab (ClassCastException). Es ist wichtig, ein solches Verhalten ohne Silent-Errors oder NPEs zu minimieren. Es ist wichtig, Situationen gut zu differenzieren, in denen ein Fehler behandelt werden sollte und in denen einfach null zurückgegeben werden kann.
Kotlin bietet zwei Operatoren:
as: strenge Typumwandlung, wirft ClassCastException bei Typunterschieden.as?: sicherer Cast – gibt null zurück, wenn der Cast nicht möglich ist.val x: Any = "Hello, Kotlin!" val s1: String = x as String // Ok, x ist ein String val s2: String? = x as? String // Ok, x ist ein String val n: Int? = x as? Int // n = null, sicherer Cast
as wirft ClassCastException bei einem Fehler.as? gibt null zurück und minimiert katastrophale Fehler.Überprüft 'as' immer den Typ zur Laufzeit?
Ja, wenn der Cast mit inkompatiblen Typen durchgeführt wird, tritt ClassCastException auf. Für einige implizite Umwandlungen, wie zwischen Int und Float, erfolgt jedoch keine solche Umwandlung – idiomatische Umwandlung in Kotlin erfolgt über Methoden (toInt, toFloat).
Kann 'as' mit nullable Typen in not-null Typen verwendet werden?
Ja, aber seien Sie vorsichtig: wenn der Wert null ist, wird eine Ausnahme ausgelöst. Jeder Cast von nullable zu non-null ohne Prüfung kann zur Laufzeit zu einem Fehler führen.
val x: String? = null val y: String = x as String // wirft ClassCastException!
Was ist der Unterschied zwischen 'is' und 'as'?
'is' ist der Typprüfungsoperator. Er gibt true/false zurück, wandelt den Typ nicht um. 'as' wandelt den Typ um, und wenn dies nicht möglich ist, wirft er eine Ausnahme (oder gibt bei Verwendung von 'as?' null zurück). Oft werden sie zusammen verwendet, um eine sichere Umwandlung zu ermöglichen:
if (x is String) { val s: String = x // smart cast }
as ohne Typprüfung, was zu ClassCastException führt.Im Modul zur Datenparsing werden alle Objekte über as geparst, zum Beispiel obj as Double. Wenn die Daten fehlerhaft sind – stürzt die Anwendung mit ClassCastException ab.
Vorteile:
Nachteile:
Es wird die smart-cast-Konstruktion (über is) oder ein sicherer Cast (as?) verwendet:
val price = (obj as? Double) ?: 0.0
Vorteile:
Nachteile: