typealias în Kotlin

Dă un nume nou, mai scurt sau mai clar, unui tip existent; nu creează un tip nou.

Sintaxă
typealias NumeNou = TipExistent
typealias Catalog = Map<String, List<Double>>
typealias Regula = (Double) -> Boolean

Ce face typealias

typealias definește un alt nume pentru un tip care există deja. Este util pentru tipuri lungi (Map<String, MutableList<Pair<Int, Double>>>) și pentru tipuri funcție ((Comanda) -> Boolean), care devin mai ușor de citit.

Alias-ul este doar un nume: compilatorul îl înlocuiește cu tipul original. Un typealias Lei = Double nu te împiedică să pui o valoare în euro acolo unde se așteaptă Lei. Dacă vrei un tip cu adevărat separat, folosește value class.

Se declară la nivelul de sus al fișierului (nu în funcții sau clase) și poate avea parametri generici: typealias Grupe<T> = Map<String, List<T>>.

Exemple

Exemplul 1: Nume pentru un tip funcție

Filtru înseamnă „funcție care primește un Produs și dă Boolean”.

data class Produs(val nume: String, val pret: Double, val categorie: String)

typealias Filtru = (Produs) -> Boolean

fun aplica(produse: List<Produs>, filtre: List<Filtru>): List<String> =
    produse.filter { p -> filtre.all { it(p) } }.map { it.nume }

fun main() {
    val produse = listOf(
        Produs("Telemea", 32.0, "lactate"),
        Produs("Iaurt", 4.5, "lactate"),
        Produs("Salam", 45.0, "mezeluri"),
    )
    val ieftin: Filtru = { it.pret < 40 }
    val lactate: Filtru = { it.categorie == "lactate" }
    println(aplica(produse, listOf(ieftin, lactate)))
}

Rezultat

[Telemea, Iaurt]

Exemplul 2: Alias pentru un tip lung, cu parametru generic

Grupe<Int> este exact Map<String, List<Int>>.

typealias Grupe<T> = Map<String, List<T>>

fun medii(note: Grupe<Int>): Map<String, Double> =
    note.mapValues { (_, lista) -> lista.average() }

fun main() {
    val catalog: Grupe<Int> = mapOf(
        "Ana" to listOf(9, 10, 8),
        "Radu" to listOf(6, 7),
    )
    for ((elev, medie) in medii(catalog)) {
        println("$elev: %.2f".format(medie))
    }
}

Rezultat

Ana: 9.00
Radu: 6.50

Exemplul 3: Alias-ul nu creează un tip nou

Lei și Euro sunt amândouă Double, așa că pot fi amestecate fără eroare. Pentru tipuri separate există value class.

typealias Lei = Double
typealias Euro = Double

fun platesteInLei(suma: Lei) = println("Plătit: $suma lei")

fun main() {
    val pretEuro: Euro = 20.0
    platesteInLei(pretEuro)          // compilează: ambele sunt Double
    val x: Double = pretEuro
    println("Ca Double: $x")
}

Rezultat

Plătit: 20.0 lei
Ca Double: 20.0

Greșeli frecvente

  • A crede că typealias adaugă verificări de tip: Lei și Euro rămân același Double.
  • Declararea unui typealias într-o funcție sau clasă: este permis doar la nivelul de sus al fișierului.
  • Alias-uri pentru tipuri simple și clare (typealias Text = String): adaugă un nume în plus fără să facă codul mai clar.

Comenzi înrudite

  • value class: value class învelește o singură valoare într-un tip nou, pentru siguranță la compilare, fără costul unui obiect la rulare.
  • lambda: O lambda este o funcție fără nume, scrisă între acolade, pe care o poți pune într-o variabilă sau trimite altei funcții.
  • Generics (<T>) și where: Generics permit clase și funcții care lucrează cu orice tip (T), verificat la compilare; where adaugă mai multe restricții pe T.