Smart Casting ist ein Mechanismus, bei dem der Kotlin-Compiler automatisch den Typ herunterstuft, nachdem er auf einen bestimmten Typ oder null überprüft wurde. Dadurch können Eigenschaften und Methoden des Typs, in den umgewandelt wurde, ohne explizite Umwandlung verwendet werden.
fun demo(x: Any) { if (x is String) { println(x.length) // x wird automatisch auf String umgewandelt } }
Funktioniert mit:
is / !is Operatoren (z. B. in if oder when)if (x != null))Funktioniert nicht:
val str: String? = getString() if (str != null) println(str.length) // Smart Cast
val something: Any get() = fetch() if (something is String) { println(something.length) // Fehler: Smart Cast ist nicht möglich }
Kann man auf Smart Cast für open oder var Eigenschaften einer Klasse innerhalb von Methoden zählen?
Nein! Smart Cast funktioniert nur mit lokalen Variablen und val-Eigenschaften in finalen Klassen. Bei offenen (open) oder var-Eigenschaften ist sich der Compiler nicht sicher, ob sich der Wert durch andere Threads oder Nachkommen ändern kann. Für diese sind manuelle Casts oder lokale Variablen erforderlich.
open class Base { open var maybeString: Any? = "abc" fun check() { if (maybeString is String) { // println(maybeString.length) // Fehler: Smart Cast ist nicht möglich val asString = maybeString as String println(asString.length) // expliziter Cast } } }
Geschichte
In einem Projekt wurden für die Logik der Bildschirme open var Eigenschaften von Modellen verwendet. Der Programmierer verließ sich auf Smart Cast nach der Überprüfung if (model is SomeType), aber bei der Kompilierung musste er alles manuell umwandeln, was die Lesbarkeit beeinträchtigte und zu Duplikationen im Code führte, da er die Einschränkung von Smart Cast auf var/open nicht kannte.
Geschichte
Bei der Beschaffung von Daten über einen Getter (z. B. über einen Delegaten oder eine Validierung) funktionierte Smart Cast für den Wert nicht. Der Entwickler verstand die Gründe nicht und verbrachte mehrere Stunden mit Debugging, bis er feststellte, dass der Compiler Smart Cast für solche Getter nicht anwendet, da sie zwischen den Aufrufen unterschiedliche Werte zurückgeben können.
Geschichte
In einem Projekt trat beim Umgang mit Nullable-Werten über if (obj != null) Smart Cast innerhalb des Zweigs auf, und beim Parallelisieren des Codes traten NullPointerExceptions aufgrund von Zugriffen außerhalb des garantierten Bereichs auf. Dies zeigte ein unzureichendes Verständnis für die lokale Wirkung von Smart Cast und die Besonderheiten von Multithreading-Szenarien bei der Arbeit mit Nullable-Variablen.