问题描述
我想编写一个函数,该函数需要使用float_info
之类的类声明的类表示形式。
我有一个基类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用作化类型参数。请改用类”。
T::class.java
这从同伴对象声明中删除了冗余,但将其放入了调用中,并基本上使类中的type参数无用。
是否有一种方法可以使类声明// 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
或者是另一种取消activityClass参数的方式,这样我就可以拥有这样的东西:
// 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)
解决方法
有没有一种方法可以使在类声明中使用的类型参数正确化
不。但是,如果您使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>) { ... }
有关out
的含义,请参见official documentation或What is out keyword in kotlin。