函数类型是 Kotlin 里"接口的替代品"——() -> Unit比interface Callback { fun onDone() }短得多,而且能享受函数类型带来的语言特性(泛型、型变、空安全、默认值)。typealias则解决另一个痛点:(User) -> Boolean这类签名在项目里反复出现,长且难读。两者一起答,正是"用 Kotlin 的语言特性而不是绕着写"的信号。
先把结论放在前面:函数类型FunctionN<P1..Pn, R>的本质是接口——() -> Unit对应Function0<Unit>、(Int) -> String对应Function1<Int, String>,都有invoke方法。所以函数类型可以做变量、可以传参、可以返回(函数类型的字段不带invoke括号才是"函数引用",带括号就是调用)。typealias是纯编译期别名,展开后没有任何类型检查加成——它只改善可读性,不改变类型系统。这两条边界是本篇的核心:函数类型有语言级能力,typealias 没有。
机制拆解
先看函数类型的实现。(Int) -> St