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ă
typealiasadaugă verificări de tip:LeișiEurorămân acelașiDouble. - 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.