Typealias — mi ez, szintaxis és alkalmazása Kotlinban

Szerző: IT Sectr Megjelenés: 2026-06-23 Olvasási idő: 7 perc

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 — álnév egy meglévő típushoz, nem hoz létre új típust
  • Funkcionális típusok — a typealias az összetett (T) -> R helyett olvasható neveket használ, mint a Callback
  • Generikusok — a typealias támogatja az általánosított paramétereket: typealias ListMapper = (T) -> T
  • Beágyazott osztályok — a typealias lerövidíti a beágyazott osztályok elérését más csomagokból
  • Típusbiztonság — a typealias nem ad ellenőrzéseket a fordítási szakaszban, az álnév teljesen felcserélhető az eredetivel

Mi az a typealias?

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.

Typealias funkcionális típusokhoz

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) -> Result, nehezítik a kód olvasását. A typealias rövid, jelentéssel bíró nevekké alakítja őket, amelyek dokumentálják a függvény célját: a typealias Validator = (String) -> Boolean meghatározza, hogy ez egy sztringérvényesítő.

kotlin
// 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) -> List egy rövid név mögé rejti. A findUsers aláírása olvashatóvá válik: «UserFilter-t fogad, List-t ad vissza». A typealias OnClickListener a kódot interfészdeklarációhoz hasonlóvá teszi, de külön interfész vagy absztrakt osztály létrehozásának többletterhe nélkül. A lambdák és névtelen függvények továbbra is a megszokott módon működnek — a typealias nem igényel változtatásokat a hívó kódban.

Typealias generikusokkal

A typealias támogatja az általánosított paramétereket (generikusokat), ami még rugalmasabbá teszi. Definiálható typealias Mapper = (T) -> R és bármilyen típussal használható. A fordító konkrét típusokat helyettesít a paraméterek helyére az álnév minden használatakor, megőrizve a teljes típusbiztonságot.

kotlin
// 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 — egy általánosított álnév bármilyen T-ből R-be történő átalakításhoz. Provider — értékszolgáltató (argumentumok nélküli gyár). ListTransformer — lista átalakító függvénye. A processNumbers(mapper: Mapper) hívásakor a fordító az álnevet (Int) -> String-re bontja ki. A generikusok univerzális eszközzé teszik a typealias-t, amely a deklarációk többszörözése nélkül bármilyen kontextusban alkalmazható.

Typealias beágyazott osztályokhoz és hosszú nevekhez

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.

kotlin
// Á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.

Typealias vs inline class: különbségek

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őTypealiasInline class
Új típusNem — az eredeti szinonimájaIgen — új típus ellenőrzésekkel
TeljesítményNulla — teljesen törlődikNulla — a burkoló eltűnik a bájtkódban
ÖröklődésNemNem (final class)
Saját metódusokNemIgen — függvények deklarálhatók
TípusbiztonságNem — felcserélhető az eredetivelIgen — 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

Miben különbözik a typealias az import alias-tól?

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ő.

Használható-e a typealias rekurzív típus létrehozására?

Igen, a typealias támogatja a rekurzív definíciókat funkcionális típusokhoz, de óvatossággal: a typealias Rec = (T) -> Rec működik, de a rekurzív hivatkozások object-re — nem. A fordító ellenőrzi a ciklusokat és hibát ad a végtelen definíciókra.

Befolyásolja-e a typealias a teljesítményt?

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.

Mi a typealias maximális beágyazási szintje?

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.

Deklarálható-e typealias függvényen belül?

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

  • Typealias — szinonima egy meglévő típushoz, nem hoz létre új típust és törlődik a fordítás során
  • Funkcionális típusok — a fő alkalmazási terület: a typealias a (T) -> R helyett olvasható nevet használ, mint a Callback
  • Generikusok a typealias-ban lehetővé teszik általánosított Mapper álnevek létrehozását bármilyen típushoz
  • Beágyazott osztályok — a typealias lerövidíti a mélyen beágyazott típusok és könyvtárak hosszú neveinek elérését
  • Típusbiztonság nincs: a typealias teljesen felcserélhető az eredeti típussal
  • Value class — alternatíva a typealias helyett, ha szigorú típusellenőrzésre van szükség nulla futásidő költséggel
  • Olvashatóság — a fő előny: a jelentéssel bíró típusnevek öndokumentálóvá teszik a kódot többletterhelés nélkül

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.

Projekt megbeszélése

Olvassa el is