A typealias egy Kotlin-mechanizmus egy meglévő típus alternatív nevének létrehozására. A typealias kulcsszó lehetővé teszi egy összetett típusdeklaráció rövid és érthető álnévvel való helyettesítését anélkül, hogy új típust hozna létre. A Kotlin-dokumentáció (2026) szerint a typealias javítja a kód olvashatóságát, különösen a függvényaláírásokban funkcionális típusok esetén. A typealias öndokumentálóvá teszi a kódot, a terjengős deklarációkat érthető elnevezett típusokkal helyettesítve.
Főbb pontok
Typealias (típus álnév) — egy deklaráció, amely alternatív nevet vezet be egy meglévő típus számára. Szintaxis: typealias ÚjNév = MeglévőTípus. A deklaráció után az ÚjNév bárhol használható, ahol a MeglévőTípus várható — a fordító ugyanazon típusként kezeli őket. A bájtkód szintjén a typealias nem hagy nyomot: az álnévvel kapcsolatos összes információ törlődik a fordítási szakaszban.
A typealias fő célja a kód olvashatóságának javítása. A hosszú aláírás fun process(callback: (Result) -> Unit) helyett írhatjuk typealias Callback = (Result) -> Unit és használhatjuk a Callback-et paramétertípusként. Ez különösen akkor hasznos, ha ugyanaz a funkcionális típus több helyen ismétlődik a kódban: az álnév egységes definíciós pontként szolgál és dokumentálja a típus célját.
A typealias nem hoz létre új típust — ez csak egy szinonima. A Callback és (Result) -> Unit típusú változók teljesen felcserélhetők. A fordító nem ad hibát, ha egy Callback-et váró függvénybe közvetlenül lambdát adunk át. Ez különbözteti meg a typealias-t az inline class-tól (value class), amely egy új burkoló típust hoz létre fordítási ellenőrzéssel. A typealias átnevezés, nem burkolás.
A typealias leggyakoribb alkalmazási forgatókönyve Kotlinban a funkcionális típusok. A hosszú aláírások, mint (Int, String) -> Boolean vagy (List
// Typealias nélkül
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// Typealias-szal
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// Használat osztályban
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
A példában a typealias UserFilter az összetett funkcionális típust (List
A typealias támogatja az általánosított paramétereket (generikusokat), ami még rugalmasabbá teszi. Definiálható typealias Mapper
// Generikus typealias
typealias Mapper<T, R> = (T) -> R
typealias Provider<T> = () -> T
typealias ListTransformer<T> = (List<T>) -> List<T>
fun processNumbers(mapper: Mapper<Int, String>) {
// mapper típusa (Int) -> String
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
A listában a Mapper
A beágyazott osztályok és hosszú paraméterezett típusok — egy másik terület, ahol a typealias jelentősen egyszerűsíti a kódot. Ha egy osztály mélyen van a beágyazási hierarchiában (Outer.Inner.Nested), a teljes néven való hivatkozás elborítja a kódot. A typealias lerövidíti ezt az elérést és olvashatóbbá teszi. Ez különösen fontos a harmadik féltől származó könyvtárak hosszú nevű osztályai esetében.
// Álnév beágyazott osztályhoz
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// Álnév hosszú könyvtártípushoz
typealias UserId = Long
typealias JsonMap = Map<String, Any?>
fun process(error: NetworkError) {
println("${error.code}: ${error.message}")
}
fun parseJson(data: JsonMap): UserId {
return data["id"] as? Long ?: 0L
}
A példában a NetworkError — egy álnév a NetworkResponse.Error beágyazott osztályhoz. A typealias importálásakor a NetworkError használható szokásos típusként, anélkül, hogy felfednénk a beágyazási hierarchiát. A JsonMap dokumentálja, hogy a térkép egy JSON-objektumot reprezentál. A UserId magyarázza a Long célját az adott kontextusban — az olvasó azonnal megérti, hogy ez egy felhasználói azonosító, nem egy tetszőleges szám. A typealias azonban nem véd a sima Long átadása ellen ott, ahol UserId várható — ehhez value class szükséges.
A typealias és az inline class (value class) különböző feladatokat old meg, bár mindkettő új nevet vezet be egy típus számára. A typealias csak egy szinonima: a UserId = Long típusú változó bármilyen Long-ot elfogad ellenőrzés nélkül. Az inline class egy új típusba csomagolja az értéket, amelyet a fordítás során ellenőriznek: egy sima Long átadása oda, ahol inline class UserId várható, explicit konverzió nélkül lehetetlen.
| Jellemző | Typealias | Inline class |
|---|---|---|
| Új típus | Nem — az eredeti szinonimája | Igen — új típus ellenőrzésekkel |
| Teljesítmény | Nulla — teljesen törlődik | Nulla — a burkoló eltűnik a bájtkódban |
| Öröklődés | Nem | Nem (final class) |
| Saját metódusok | Nem | Igen — függvények deklarálhatók |
| Típusbiztonság | Nem — felcserélhető az eredetivel | Igen — a fordító megkülönbözteti a típusokat |
A táblázat a két mechanizmus közötti különbséget mutatja. A typealias rövid nevekhez és kód dokumentálásához alkalmas, ha nincs szükség szigorú tipizálásra. Az inline class a value class kulcsszóval (korábban inline class) akkor szükséges, ha fontos megkülönböztetni ugyanazon primitív típus szemantikailag különböző értékeit. Például a UserId és az OrderId egyaránt Long, de az egyik átadása a másik helyére logikai hiba, amelyet a value class a fordítás során megelőz.
Gyakran ismételt kérdések
Az import alias (import com.example.LongName as Short) az import szintjén működik — csak az aktuális fájlban rövidíti a nevet. A typealias egy globális álnevet deklarál, amely az import után a teljes projektben elérhető.
Igen, a typealias támogatja a rekurzív definíciókat funkcionális típusokhoz, de óvatossággal: a typealias Rec
Nem, a typealias teljesen törlődik a fordítási szakaszban. A bájtkódban és futásidőben az eredeti típus kerül használatra mindenféle burkolás nélkül. A teljesítmény megegyezik az eredeti típus közvetlen használatával.
A typealias hivatkozhat egy másik typealias-ra — ezt álnévláncnak nevezzük. A lánc mélysége formálisan nem korlátozott, de az olvashatóság érdekében legfeljebb 2–3 szint ajánlott. A fordító a láncot teljesen kibontja az elemzési szakaszban.
Nem, a typealias legfelső szintű deklaráció vagy osztály/objektum tagja. Függvényeken belül nem deklarálható typealias. Helyi típusrövidítéshez használjon import alias-t a fájlon belül, vagy emelje ki a typealias-t modul szintre.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is