Kotlin中的reified关键字如何工作?

hl3mukkel

我正在尝试了解reified关键字的目的,显然它使我们能够对泛型进行反思

但是,当我忽略它时,它也可以正常工作。任何人都想解释一下这何时会产生实际变化

s1m0nw1

TL; DR:有什么reified好处

fun <T> myGenericFun(c: Class<T>) 

在这类通用函数的主体中myGenericFun,您无法访问该类型,T因为它仅在编译时可用,在运行时被擦除因此,如果要将泛型用作函数主体中的普通类,则需要显式传递该类作为参数,如中所示myGenericFun

如果您创建inline带有reified 函数,即使在运行时也可以访问T的类型T,因此您无需Class<T>额外传递您可以一起工作T,就好像它是一个正常的类-例如,你可能要检查一个变量是否是一个实例 T,您可以轻松做到,那么:myVar is T

inline具有reified类型的此类函数T如下所示:

inline fun <reified T> myGenericFun()

如何reified工作

您只能reifiedinline功能结合使用这样的函数使编译器将函数的字节码复制到使用该函数的每个位置(该函数被“内联”)。当您调用带有类型化的内联函数时,编译器知道用作类型实的实际类型,并修改生成的字节码以直接使用相应的类。因此,在字节码中和在运行时,调用如myVar is T成为myVar is String(如果type参数为String成为


让我们看一个示例,该示例显示了如何帮助reified您。我们要创建一个扩展功能StringtoKotlinObject,试图JSON字符串转换为纯科特林对象与函数的泛型类型指定的类型T我们可以使用com.fasterxml.jackson.module.kotlin它,第一种方法是:

a)没有确定类型的第一种方法

fun <T> String.toKotlinObject(): T {
      val mapper = jacksonObjectMapper()
                                                        //does not compile!
      return mapper.readValue(this, T::class.java)
}

readValue方法采用应该解析JsonObject为的类型。如果尝试获取Classtype参数的T,则编译器会抱怨:“不能将'T'用作化类型参数。请改用类。”

b)使用显式Class参数的解决方法

fun <T: Any> String.toKotlinObject(c: KClass<T>): T {
    val mapper = jacksonObjectMapper()
    return mapper.readValue(this, c.java)
}

解决方法是ClassT可以将of作为方法参数,然后将其用作参数readValue这是可行的,并且是通用Java代码中的常见模式。可以这样称呼:

data class MyJsonType(val name: String)

val json = """{"name":"example"}"""
json.toKotlinObject(MyJsonType::class)

c)科特林方式: reified

使用inline带有reified类型参数T的函数可以以不同的方式实现该函数:

inline fun <reified T: Any> String.toKotlinObject(): T {
    val mapper = jacksonObjectMapper()
    return mapper.readValue(this, T::class.java)
}

无需另外使用Classof TT可以像普通类一样使用。对于客户端,代码如下所示:

json.toKotlinObject<MyJsonType>()

重要说明:使用Java

reified类型的内联函数不能从Java代码中调用

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

“ is”关键字如何工作?

来自分类Dev

“ this”关键字如何工作?

来自分类Dev

in`关键字在迭代器中如何工作?

来自分类Dev

在Swift中,“ let”关键字到底如何工作?

来自分类Dev

关键字USING在PostgreSQL中如何工作?

来自分类Dev

给定关键字在Scala 3或dotty中如何工作?

来自分类Dev

Oracle中的Interval关键字如何工作?

来自分类Dev

在Swift中,“ let”关键字到底是如何工作的?

来自分类Dev

Canopy的IPython中的global关键字如何工作?

来自分类Dev

“ this”关键字:Java中的工作机制

来自分类Dev

自调用函数中不带var关键字的变量如何工作?

来自分类Dev

java中此关键字的显式作用域如何工作?

来自分类Dev

python中的“in”关键字是如何工作的?有没有更快的方法?

来自分类Dev

ref关键字如何工作(就内存而言)

来自分类Dev

扩展JFrame-“ super”关键字如何工作?

来自分类Dev

传递带有关键字“this”的对象如何工作?

来自分类Dev

这些 postgres 关键字如何协同工作?

来自分类Dev

Kotlin中的“ external”关键字的目的是什么?

来自分类Dev

Kotlin中“ let”关键字的目的是什么

来自分类Dev

Kotlin中Hard和Soft关键字之间的区别

来自分类Dev

异步是Kotlin中协程的关键字吗?

来自分类Dev

Kotlin中的Getters:get关键字的目的

来自分类Dev

最终关键字在Android中的工作方式

来自分类Dev

“ super()”关键字在列表理解中无法正常工作

来自分类Dev

如何快速从不包含关键字列表中的关键字的列表中删除项目?

来自分类Dev

如何在Python的字典中要求子关键字的关键字?

来自分类Dev

elasticsearch如何使用精确搜索并忽略关键字中的关键字特殊字符?

来自分类Dev

如何使用IN关键字?

来自分类Dev

如何开发关键字?

Related 相关文章

  1. 1

    “ is”关键字如何工作?

  2. 2

    “ this”关键字如何工作?

  3. 3

    in`关键字在迭代器中如何工作?

  4. 4

    在Swift中,“ let”关键字到底如何工作?

  5. 5

    关键字USING在PostgreSQL中如何工作?

  6. 6

    给定关键字在Scala 3或dotty中如何工作?

  7. 7

    Oracle中的Interval关键字如何工作?

  8. 8

    在Swift中,“ let”关键字到底是如何工作的?

  9. 9

    Canopy的IPython中的global关键字如何工作?

  10. 10

    “ this”关键字:Java中的工作机制

  11. 11

    自调用函数中不带var关键字的变量如何工作?

  12. 12

    java中此关键字的显式作用域如何工作?

  13. 13

    python中的“in”关键字是如何工作的?有没有更快的方法?

  14. 14

    ref关键字如何工作(就内存而言)

  15. 15

    扩展JFrame-“ super”关键字如何工作?

  16. 16

    传递带有关键字“this”的对象如何工作?

  17. 17

    这些 postgres 关键字如何协同工作?

  18. 18

    Kotlin中的“ external”关键字的目的是什么?

  19. 19

    Kotlin中“ let”关键字的目的是什么

  20. 20

    Kotlin中Hard和Soft关键字之间的区别

  21. 21

    异步是Kotlin中协程的关键字吗?

  22. 22

    Kotlin中的Getters:get关键字的目的

  23. 23

    最终关键字在Android中的工作方式

  24. 24

    “ super()”关键字在列表理解中无法正常工作

  25. 25

    如何快速从不包含关键字列表中的关键字的列表中删除项目?

  26. 26

    如何在Python的字典中要求子关键字的关键字?

  27. 27

    elasticsearch如何使用精确搜索并忽略关键字中的关键字特殊字符?

  28. 28

    如何使用IN关键字?

  29. 29

    如何开发关键字?

热门标签

归档