Kotlin中的意图:
val intent = Intent(this, OtherActivity::class.java)
为什么不能只是:
val intent = Intent(this, OtherActivity)
Intent构造函数的第二个参数需要您要创建的"活动"的类。虽然只使用类名OtherActivity
获取类会很方便,但Java(和Kotlin(语法不支持这一点。
相反,Java提供.class
语法(OtherActivity.class
(,Kotlin为Kotlin类提供::class
,为Java类提供::class.java
(OtherActivity::class.java
(,这正是Intent构造函数所需要的。
使用::class
,Kotlin提供了一个KClass
,它可以用于各种用途。然而,仍然有一些Java包使用Class
,其中包括Intent。KClass不是Class,这意味着Kotlin需要有一种访问常规Java Class的方法。
Intent
类最初是用Java编写的,这意味着它使用了Class
。OtherActivity::class
返回一个KClass,而KClass不能作为Class
传递。
SomeClass::class.java
的存在是为了实现互操作。您也可以在Kotlin代码中使用Class
而不是KClass
;您不会像CCD_ 17而不是CCD_。但是您仍然需要一个带有Java互操作的Class
。
除了语言本身的开发人员之外,任何人都无法回答他们为什么特别使用::class.java
。
因为Intent是一个java类,需要一个Android上下文和一个java类(活动(作为参数。
如果您可以接受一点命名空间污染,并且这是您团队中真正关心的问题,那么您可以随时声明以下顶级函数:
inline fun <reified T> Intent(context: Context){
return Intent(context, T::class.java)
}
你会称之为做以下事情:
val intent = Intent<MyActivity>(this)
或者,如果您愿意,您可以在Context:上将其声明为扩展函数
inline fun <reified T> Context.Intent(){
return Intent(this, T::class.java)
}
像这样直接使用它:
val intent = Intent<MyActivity>()