【问题标题】:Why we write NextActivity::class.java although this is a kotlin class?为什么我们写 NextActivity::class.java 虽然这是一个 kotlin 类?
【发布时间】:2018-01-18 09:47:14
【问题描述】:

我们必须用扩展名 .java 编写这一行,虽然它的扩展名是 .kt 我认为 Kotlin 文件转换为 java 文件,但 java 也转换为字节码,所以我们也可以使用 .class 文件如果 Kotlin 代码转换进入java代码。

NextActivity::class.java NextActivity::class.kt //not worked

btn?.setOnClickListener {
   startActivity(Intent(this, NextActivity::class.java))
}

所以问题是为什么我们在NextActivity::class.java中写.java

问题来自here

【问题讨论】:

  • java 只是一个从KClass 获取课程的属性。它不是扩展。
  • @holi-java 分析后你就在这里 我知道NextActivity::class 返回KClass 引用并且KClass 具有属性.java 并且Intent(Context packageContext, Class cls) 参数类型是Class所以最终的答案是这不是扩展名。

标签: java android kotlin


【解决方案1】:

因为你想访问Java Class 的方法。

我认为它们不是在 Kotlin 中从头开始重新实现的,因此,为了访问它们,您必须将您的 kotlin 类“反射”为 Java 类。

NextActivity::class 返回 KClass 引用,KClassproperty javaIntent 构造函数签名是 Intent(Context packageContext, Class cls) 所以第二个参数是 Class 类型 所以最终的答案是是这不是扩展,这只是属性。

【讨论】:

  • 这意味着我们可以将 .kt 写入 .java 并且可以检测到,对吧?
  • ::class.kt 不存在,只有 ::class 存在,但它会返回一个 KClass(Kotlin 类)而不是一个类(在 Java 类的意义上)。可能 NextActivity 需要一个 Class 参数而不是一个 KClass
【解决方案2】:

您正在从 Kotlin 调用 Java 代码。 Intent 是 Android 中的 Java 类。

文档:https://kotlinlang.org/docs/reference/reflection.html#class-references

请注意,Kotlin 类引用与 Java 类不同 参考。要获取 Java 类引用,请使用 .java 属性 一个 KClass 实例。

您不能将 Kotlin 类引用传递给 Java(在您的情况下为 Intent),因此您必须传递 Java 类引用。

来自互操作文档:https://kotlinlang.org/docs/reference/java-interop.html#java-reflection

Java 反射适用于 Kotlin 类,反之亦然。如前所述 上面,您可以使用 instance::class.java、ClassName::class.java 或 instance.javaClass 通过 java.lang.Class 进入 Java 反射。

【讨论】:

    猜你喜欢
    • 2022-11-07
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2022-01-20
    • 2021-10-11
    • 2022-10-08
    • 2020-05-20
    相关资源
    最近更新 更多