reified这个词很多人写得出,但被问"它为什么依赖 inline"就答不上。这题真正的考点是泛型擦除这个 JVM 机制:为什么x is T在普通函数里编译不过、reified到底做了什么、以及它有哪些不能做的事。把这三层讲清,后面关于泛型、序列化、依赖注入的追问都能接上。
先把结论放在前面:JVM 的泛型是擦除的——List<String>与List<Int>在字节码里都是List,类型参数在编译后被替换成上界(通常是Object),所以运行期拿不到T的Class对象。reified只能用在inline函数上,编译器会把调用点的实际类型写进函数体,等于把泛型"具体化"了。于是x is T、T::class、T::class.java、typeOf<T>()、泛型数组创建这些操作就都能编译通过。
机制拆解
用一个具体例子讲清。fun <T> isString(x: Any) = x is T—— 擦除后T变成Object