为什么 Intent 中的类具有 "::class.java" 后缀?



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编写的,这意味着它使用了ClassOtherActivity::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>()

相关内容

最新更新