当前位置: 首页 > 知识库问答 >
问题:

Kotlin中的具体化关键词是如何工作的?

施永宁
2023-03-14

我试图理解reificed关键字的用途,显然它允许我们对泛型进行反思。

然而,当我把它排除在外时,它的工作也一样好。有人想解释一下这什么时候会有实际的不同吗?

共有1个答案

杜禄
2023-03-14
fun <T> myGenericFun(c: Class<T>) 

在像MyGenericFun这样的泛型函数的主体中,您不能访问T类型,因为它只在编译时可用,但在运行时被擦除。因此,如果希望将泛型类型用作函数体中的普通类,则需要显式地将该类作为参数传递,如MyGenericFun所示。

如果您创建一个内联函数,该函数带有一个具体化的T,那么即使在运行时也可以访问T的类型,因此您不需要另外传递。您可以使用T,就像它是一个普通的类一样-例如,您可能希望检查一个变量是否是T的实例,那么您可以很容易地做到这一点:MyVar is t

这样的内联函数具有reificed类型t如下所示:

inline fun <reified T> myGenericFun()

让我们看一个示例,该示例显示reificed有多大帮助。我们希望为string创建一个名为TokotlinObject的扩展函数,该函数尝试将JSON字符串转换为普通Kotlin对象,其类型由函数的泛型类型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的类型。如果我们试图获取类型参数t,编译器会抱怨:“不能使用't'作为具体化的类型参数,而是使用类。”

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

作为一种解决办法,可以将T设置为方法参数,然后将其用作readvalue的参数。这是有效的,并且是通用Java代码中的一个常见模式。可以这样称呼:

data class MyJsonType(val name: String)

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

c)科特林方式:具体化

使用内联函数并将具体化类型参数t使用,可以以不同的方式实现函数:

inline fun <reified T: Any> String.toKotlinObject(): T {
    val mapper = jacksonObjectMapper()
    return mapper.readValue(this, T::class.java)
}
json.toKotlinObject<MyJsonType>()
 类似资料:
  • 在Kotlin中,编译以下代码: 但是,该代码不: 编译此代码将导致以下错误: 在Java中,两个示例都无法编译: 不出所料,前面的两个代码片段都会产生熟悉的编译器错误: 令我惊讶的是,第一个 Kotlin 示例根本有效,其次,如果它有效,为什么第二个 Kotlin 示例会失败?Kotlin 是否将方法的返回类型视为其签名的一部分?此外,为什么 Kotlin 中的方法签名与 Java 相比,它遵循

  • 我刚刚阅读了关于特征以及如何在同一个用逗号分隔的php代码中使用多个php特征的信息。然而,我不明白用于在两个特征具有相同功能的情况下解决冲突的替代关键字的概念。有人能解释一下替代关键字是如何工作的吗?以及如何使用它来告诉引擎,我愿意使用特征A的函数hello()而不是特征B的函数Hello(),因为这两个特征中都有两个特征A和B以及一个函数hello()。

  • 在Java中,我们使用关键字和变量来指定其值不可更改。但我看到您可以更改类的构造函数/方法中的值。同样,如果变量是,那么这是一个编译错误。 代码如下: 上面的代码工作良好,没有错误。 现在将变量更改为: 现在是编译错误。这个是如何工作的?

  • 问题内容: 我刚刚遇到了一个有趣的JavaScript情况。我有一个类,该类的方法使用对象文字表示法定义了多个对象。在这些对象内部,正在使用指针。从程序的行为,我推断出指针是指向在其上调用方法的类,而不是由文字创建的对象。 尽管这是我期望的工作方式,但这似乎是任意的。这是定义的行为吗?跨浏览器安全吗?是否有任何推理依据说明它超出了“规格说明”的范围(例如,这是某些更广泛的设计决策/理念的结果)吗?

  • 因此,我需要开始考虑关联,最好是利用我对并发工具的现有知识来加快进程。 我试着为他们跟踪Google codelab,虽然它给了我一点理解,但它也提出了许多未回答的问题,所以我试图通过编写一些代码、调试和查看日志输出来弄脏我的手。 根据我的理解,一个coroutine由两个主要构件组成;挂起函数是您执行工作的地方,而coroutine上下文是您执行挂起函数的地方,这样您就可以对coroutine将

  • Kotlin定义了自己的类: 该类的实例是通过中定义的内联函数构造的: null 我认为在编译之前必须进行某种代码预处理。 请随意用一个更贴切的标题编辑这个问题。