我想编写一个函数,它需要使用类声明(如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)发布于 2020-08-13 07:47:48
是否有方法使类声明中使用的类型参数具体化?
不是的。但是,如果您使startActivity不是ActivityCompanion的成员,而是一个扩展函数,以便它可以具体化类型参数,该怎么办?
class ActivityCompanion<T: AppCompatActivity>()
fun <reified T: AppCompatActivity> ActivityCompanion<T>.startActivity(context: Context) {
context.startActivity(Intent(context, T::class.java))
}
class MyActivity : AppCompatActivity() {
companion object : ActivityStarter<MyActivity>()
...
}
MyActivity.startActivity(this)或者另一种方法来取消activityClass参数,这样我就可以得到如下内容:
如果我理解正确,并且希望ActivityStarter接受AppCompatActivity的任何子类,而没有类型参数本身,则可以将其编写为
open class ActivityStarter(protected val activityClass: Class<out AppCompatActivity>) { ... }有关正式文件或kotlin中的out关键字是什么的含义,请参阅out。
https://stackoverflow.com/questions/63377988
复制相似问题