Kotlin reified改造JSON解析

reified有什么用?

fun  myGenericFun(c: Class) 

在myGenericFun泛型函数体内,无法访问类型T,因为T只有在编译时可用,但在运行时就被擦除了,也就是泛型擦除,。因此,如果想在函数体中使用泛型类型作为普通类型使用,就需要显式将该类作为参数传递,如myGenericFun中所示。

如果使用reified T创建内联(inline)函数,则就算在运行时也可以访问 T 的类型,因此不需要另外传递 Class。可以像普通Class一样使用 T - 例如想检查一个变量是否是 T 的实例,可以轻松做到这一点:myVar is T。

这个reified T的内联(inline)函数如下所示:

inline fun  myGenericFun()

reified 工作原理

只能将reified与内联(inline)函数结合使用。通过这样做,可以告诉编译器将函数的字节码复制到调用该函数的每个位置(编译器“内联”该函数)。当调用具有reified的内联(inline)函数时,编译器必须能够知道作为类型参数传递的实际类型,以便可以修改生成的字节码以直接使用相应的类。因此,像 myVar is T 这样的调用在字节码中会变成 myVar is String(如果类型参数是 String)。

改造案例

可以采用reified封装JSON解析方法。

inline fun <reified T> Gson.fromJson(json: String) =
        fromJson<T>(json, object : TypeToken<T>(){}.type)

重要提示:具有reified类型的内联(inline)函数不能从 Java 代码中调用

感谢大家的支持,如有错误请指正,如需转载请标明原文出处!

你可能感兴趣的:(Kotlin,kotlin,json,开发语言)