inline und reified in Kotlin – den Typ zur Laufzeit behalten
Generische Typen sind in Kotlin zur Laufzeit normalerweise „weg" (Type Erasure). Mit einer inline-Funktion und reified holst du den Typ zurück – und schreibst so knappe Helfer wie fromJson<User>() ohne Class-Parameter.
Ein Detail, über das viele beim Thema Generics stolpern: Zur Laufzeit ist der Typparameter T nicht mehr da (Type Erasure, geerbt von der JVM). Du kannst also nicht einfach T::class schreiben. Kotlin hat dafür einen eleganten Ausweg: inline + reified.
Das Problem
fun <T> istVomTyp(wert: Any): Boolean {
return wert is T // ❌ Fehler: "Cannot check for instance of erased type: T"
}Die Lösung: inline fun mit reified
inline fun <reified T> istVomTyp(wert: Any): Boolean {
return wert is T // ✓ funktioniert
}
istVomTyp<String>("hi") // true
istVomTyp<Int>("hi") // falseinline bedeutet: Der Compiler kopiert den Funktionskörper an die Aufrufstelle. Dadurch ist der konkrete Typ (String, Int …) dort bekannt und reified macht ihn im Rumpf benutzbar – inklusive is T, T::class oder T::class.java.
Der Klassiker: typisiertes fromJson
So sparst du dir den lästigen Class<T>-Parameter, den Java-Bibliotheken oft verlangen:
inline fun <reified T> Gson.fromJson(json: String): T =
fromJson(json, T::class.java)
// Aufruf ohne zweiten Parameter:
val user: User = gson.fromJson(jsonString)Das liest sich viel schöner als gson.fromJson(jsonString, User::class.java) – der Typ steht links, der Rest ergibt sich.
Wann du es nutzt (und wann nicht)
- Ja: kleine Helfer, die den Typ zur Laufzeit brauchen (JSON,
findViewById-Wrapper,getSystemService). - Zurückhaltend: bei großen Funktionskörpern –
inlinekopiert den Code an jede Aufrufstelle, das bläht das Kompilat auf. Für kurze Helfer ist das egal.
Wenn du eine Android-App in Kotlin planst und Wert auf schlanken, ausdrucksstarken Code legst, setze ich das gern für dich um – schreib mir über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
kotlinx.serialization: JSON und data class ohne Handarbeit verbinden
Eine API antwortet mit JSON, deine App will eine data class. Dazwischen steht in vielen Projekten ein handgeschriebener Parser. Mit kotlinx.serialization sind es eine Annotation und eine Zeile – und ein Schalter, ohne den deine App beim nächsten API-Update abstürzt.
AnimatedVisibility in Jetpack Compose – ein- und ausblenden, das nicht springt
Ein Element einfach mit if wegzulassen, poppt hart weg. AnimatedVisibility blendet es weich ein und aus – mit sinnvollen Voreinstellungen und, wenn du willst, deiner eigenen Kombination aus Faden und Bewegung. Ich zeige dir beides.
snapshotFlow in Jetpack Compose – aus Compose-Zustand einen Flow machen
Manchmal willst du auf einen Compose-Zustand reagieren wie auf einen Datenstrom – entprellen, kombinieren, sammeln. Genau das macht snapshotFlow. Ich zeige dir das an der häufigsten Aufgabe: mehr laden, wenn der Nutzer ans Listenende scrollt.