使用类声明中的类型参数,例如函数中的类型化参数

问题描述

我想编写一个函数,该函数需要使用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 documentationWhat is out keyword in kotlin