为什么我们编写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
具有属性 java
, Intent
构造器签名是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反射。