科特林的意图:
val intent = Intent(this, OtherActivity::class.java)
为什么不能这样:
val intent = Intent(this, OtherActivity)
?
答案 0 :(得分:4)
该Intent构造函数的第二个参数要求您要创建的Activity的 class 。虽然仅使用类名OtherActivity
来获取类会很方便,但是Java(和Kotlin)语法不支持此功能。
相反,Java提供.class
语法(OtherActivity.class
),而Kotlin提供Kotlin类的::class
和Java提供的::class.java
(OtherActivity::class.java
)类,这是Intent构造函数所需要的。
答案 1 :(得分:2)
Kotlin使用::class
提供了KClass
,可用于各种用途。但是,仍然有Java包使用Class
代替,其中有Intent。 KClass不是类,这意味着Kotlin需要有一种访问常规Java类的方法。
Intent
类最初是用Java编写的,这意味着它使用了Class
。 OtherActivity::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>()