Kdy dochází k přetížení při použití inline funkcí?
sobes.tech AI
Odpověď od AI
Přetížení inline funkcí (inline functions) v Kotlinu ne probíhá v tradičním smyslu polymorfismu za běhu. Inline funkce je vložena na místo volání během kompilace. Proto, když mluvíme o "přetížení" ve vztahu k inline funkcím, obvykle máme na mysli schopnost překladače generovat několik verzí vloženého kódu pro různé kontexty volání, zejména při použití generik.
Klíčové body:
- Specializace během kompilace: Pro inline funkce s generiky (
reified) generuje překladač specializované verze kódu pro každý konkrétní typ nahrazený za typový parametr. To se děje během kompilace, nikoli za běhu. - Vyhnout se dodatečné režii: Cílem inline je odstranit náklady na volání funkce. Specializace pro generiky umožňuje vyhnout se balení primitivních typů a dalším režiem, které jsou spojeny s erasure typů v Javě.
- Nejedná se o polymorfismus: Není to klasický polymorfismus, kdy přepsaná metoda je volána podle skutečného typu objektu za běhu. Zde je volba "verze" funkce provedena při kompilaci.
Příklad použití reified s inline funkcí:
inline fun <reified T> printType(value: T) {
// Kompilátor vygeneruje samostatný kód pro každý T (Int, String, atd.)
println("Typ je: ${T::class.java.name}")
}
fun main() {
printType(123) // Kód pro T = Int je generován
printType("Ahoj") // Kód pro T = String je generován
}
V tomto případě, i když voláme pouze jednu funkci printType syntakticky, kompilátor vygeneruje dvě různé verze vloženého kódu: jednu pro Int a druhou pro String. To lze považovat za formu "přetížení" nebo, přesněji, specializace při kompilaci, která je umožněna mechanismem inline, nikoli polymorfismem za běhu.