在Kotlin中启动新Activity时,为何使用.java而非.kt?
.java而不是.kt? 这问题问到点子上了!核心原因其实和Kotlin与Java的互操作性,以及Android框架的底层设计脱不开关系,咱们慢慢说:
Kotlin的
::classvs Java的Class
在Kotlin里,NextActivity::class获取到的是KClass类型的对象——这是Kotlin自己的反射API类,专门用来处理Kotlin特有的特性(比如空安全、数据类这些)。但Android的Intent构造方法需要的是Java标准的Class对象,毕竟Android SDK最初完全是基于Java开发的,所有组件相关的API都是围绕Java的Class设计的,根本不认识Kotlin的KClass。.java是Kotlin的兼容语法糖
你可能会好奇,为什么是.java不是.kt?因为.kt只是Kotlin源文件的后缀,而我们需要的是代码编译后的类对象。Kotlin代码最终会被编译成Java字节码,生成的类文件和Java编译后的一样是.class格式,对应的就是Java的Class类型。.java其实是KClass的一个扩展属性,Kotlin官方特意加这个,就是为了让开发者能轻松把Kotlin的反射对象转换成Java的,完美适配Android的老API。举个直观的对比
如果你直接写startActivity(Intent(this@MainActivity, NextActivity::class)),编译器会直接报错——因为参数类型不匹配,Intent要的是Class<*>, 你给的是KClass<NextActivity>。加上.java之后,NextActivity::class.java就把Kotlin的KClass转换成了Java的Class,刚好符合要求,代码就能正常运行了。额外提一句:现在有更简洁的写法
其实Kotlin Android扩展里提供了更清爽的启动方式,比如startActivity<NextActivity>(this),但底层逻辑还是一样的——帮你自动把NextActivity::class转换成对应的JavaClass对象,本质上和你写.java是一回事。
内容的提问来源于stack exchange,提问作者Dayanand Waghmare

