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

时间:2018-12-16 09:55:27

标签: android kotlin

科特林的意图:

val intent = Intent(this, OtherActivity::class.java)

为什么不能这样:

val intent = Intent(this, OtherActivity)

4 个答案:

答案 0 :(得分:4)

该Intent构造函数的第二个参数要求您要创建的Activity的 class 。虽然仅使用类名OtherActivity来获取类会很方便,但是Java(和Kotlin)语法不支持此功能。

相反,Java提供.class语法(OtherActivity.class),而Kotlin提供Kotlin类的::class和Java提供的::class.javaOtherActivity::class.java)类,这是Intent构造函数所需要的。

答案 1 :(得分:2)

Kotlin使用::class提供了KClass,可用于各种用途。但是,仍然有Java包使用Class代替,其中有Intent。 KClass不是类,这意味着Kotlin需要有一种访问常规Java类的方法。

Intent类最初是用Java编写的,这意味着它使用了ClassOtherActivity::class返回KClass,并且不能将KClass作为Class传递。

SomeClass::class.java存在用于互操作的目的。您还可以在Kotlin代码中使用Class代替KClass;您不会收到关于该警告的警告,就像您在Object上遇到一个实例Any一样。但是您仍然需要定期与Java互操作使用Class


除了语言本身的开发人员外,为什么他们特别选择::class.java来解决这个问题。

答案 2 :(得分:1)

因为Intent是一个Java类,并且希望将Android上下文和Java类(活动)作为参数。

答案 3 :(得分:0)

如果您可以接受一点名称空间污染,并且这是您团队中真正关心的问题,则可以始终声明以下顶级函数:

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>()