Pozwalają dodać funkcje do typu bez modyfikowania jego kodu (to cukier składniowy). Typowa pułapka: extension jest wybierany statycznie po typie zadeklarowanym, więc nie działa jak wirtualne override.
open class Base
class Child : Base()
fun Base.say() = "base"
fun Child.say() = "child"
val x: Base = Child()
println(x.say()) // "base" (static dispatch)