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
Nach mehreren Kriterien sortieren – sortedWith, compareBy und thenBy
Erst nach Priorität, dann nach Datum, und die ohne Termin ganz nach hinten: Solche Sortierungen werden mit einem handgeschriebenen Comparator schnell unleserlich. Kotlin hat dafür eine Baukastenschreibweise.
Room-Migrationen – das Schema ändern, ohne Nutzerdaten zu verlieren
Eine neue Spalte in der Entity, und beim nächsten Start ist der Spielstand weg – weil fallbackToDestructiveMigration die Datenbank einfach löscht. So machst du es richtig, inklusive Test.
Fehler in Coroutinen – coroutineScope, supervisorScope und wer wen mitreißt
Eine von fünf parallelen Abfragen scheitert – und plötzlich sind alle abgebrochen. Das ist kein Bug, sondern strukturierte Nebenläufigkeit. Wer den Unterschied zwischen coroutineScope und supervisorScope kennt, steuert das bewusst.