【发布时间】:2020-08-12 13:51:01
【问题描述】:
我想写一个函数,它需要使用类声明的类表示,如MyClass::class.java。
我有一个基类 ActivityStarter,我用它作为活动中伴随对象的基础。
// declarations
open class ActivityCompanion<T: AppCompatActivity>(val activityClass : Class<T>) {
fun startActivity(context: Context) {
context.startActivity(Intent(context, activityClass))
}
}
class MyActivity : AppCompatActivity() {
companion object : ActivityStarter<MyActivity>(MyActivity::class:java)
...
}
// call
MyActivity.startActivity(this)
在声明中,以及伴生对象的继承中,类基本上是传了两次。一次作为类型参数,一次作为普通参数。 (ActivityStarter<MyActivity>(MyActivity::class:java))。
参数activityClass是必须的,因为我不能使用T::class.java。 “不能将 T 用作具体类型参数。请改用类”。
我以前只是在函数调用中传递参数:
// declarations
open class ActivityStarter {
inline fun <reified T : AppCompatActivity>startActivity(context: Context) {
context.startActivity(Intent(context, T::class.java))
}
}
class MyActivity : AppCompatActivity() {
companion object : ActivityStarter()
...
}
// call
MyActivity.startActivity<MyActivity>(this)
这消除了伴随对象声明中的冗余,但将其放入调用中,基本上使类中的类型参数无用。
有没有办法让类声明中使用的类型参数reified,这样我就可以有这样的实现了?:
// declarations
open class ActivityCompanion<reified T: AppCompatActivity>() {
fun startActivity(context: Context) {
context.startActivity(Intent(context, T::class.java))
}
}
class MyActivity : AppCompatActivity() {
companion object : ActivityStarter<MyActivity>()
...
}
// call
MyActivity.startActivity(this)
或者另一种方法来限制activityClass参数,这样我就可以拥有这样的东西:
// declarations
open class ActivityStarter(private val activityClass : Class<T : AppCompatActivity>) {
inline fun startActivity(context: Context) {
context.startActivity(Intent(context, activityClass))
}
}
class MyActivity : AppCompatActivity() {
companion object : ActivityStarter(MyActivity::class.java)
...
}
// call
MyActivity.startActivity(this)
【问题讨论】:
标签: kotlin generics inheritance