我与 Kotlin 的爱恨情仇之浅谈 reified

2,066 阅读2分钟
原文链接: www.jianshu.com

Goal: support run-time access to types passed to functions, as if they were reified (currently limited to inline functions only).

Sorry, 我并没有找到更多关于 reified 的相关文档信息啦,其中有两篇文档 《reified-type-parameters》 以及 《reference/inline-functions》, 您可以参考。

100% interoperable with Java™ and Android™ 这句话你可别真信了的!看完这篇文章你就知道了的。

reified 是什么?

这个单词,也是起的有点犀利,reified 翻译一下就是: 具体化。可以理解为 具体化一个东西。那它能具体化哪些呢?
还是先来看看怎么使用的:

    inline fun <reified T> membersOf() = T::class.members

    fun main(s: Array<String>) {
        println(membersOf<StringBuilder>().joinToString("\n"))
    }

这个方法的意思是,具体化一个 T 的类型参数,追加一个 membersOf 的方法,方法返回结果是 T 这个类中的 membersinline 内联函数关键字,内容比较多,下一章节再去细讲。

上面的用法也比较简单: <reified 具体的类型>

更多详细介绍可以参考文档: 《reified-type-parameters》 以及 《reference/inline-functions》

我爱 reified

我爱上 reified 是从做 发现页 开始的。由于服务器返回的数据结构类似 HTML结构,层级比较深,加上又有各种类型,导致不得不派生出一些具体的类。但此时就面临一个问题,我需要判断是否显示 Header。此时 reified 就派上用场啦。

比如声明这样的一个内联函数:

   inline fun <reified T : BaseModel<*>> BaseModel<*>.headerEnable(): Boolean {
        val headerData = this.dataHeader<T>()
        return headerData != null && headerData.metadata != null
    }

调用的时候:

    val headerEnable = lastItem.headerEnable<FrameListModel>()

是不是超级简洁, 方便呢?

我不爱 reified

有人告诉我说,Kotlin 100% 支持 Java ,那我现在告诉你,你单纯了的。并不是,就比如 reified,就不支持。所以当你做的项目是一个SDK的时候,要谨慎了的。

There's no way to call Kotlin inline functions from Java because they must be transformed and inlined at the call sites (in your case, T should be substituted with the actual type at each call site, but there's much more compiler logic for inline functions than just this), and the Java compiler is, expectedly, completely unaware of that. how-can-i-call-kotlin-methods-with-reified-generics-from-java

写在最后

reified 的意思是具体化。而作为 Kotlin 的一个方法 泛型 关键字,它代表你可以在方法体内访问泛型指定的JVM类对象。必须以 inline 内联方式声明这个方法才有效。至于具体内部怎么实现的,留给大家去研究了的,当然我会在后面的文章中解释到的,今天就不再延伸啦。

如果您愿意听我聊技术,可以关注我的个人公众号 SKMacTalk


SKMacTalk.png