为什么我们编写NextActivity :: class.java,尽管这是一个kotlin类?

我们必须写这个扩展名为.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

问题出现在这里 。

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

我认为它们并没有在Kotlin中从零开始重新实现,所以为了访问它们,你必须将你的kotlin类“反射”到Java类。

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

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

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

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

你不能将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反射。