首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用类声明中的类型参数,如函数中的具体化类型参数

使用类声明中的类型参数,如函数中的具体化类型参数
EN

Stack Overflow用户
提问于 2020-08-12 13:51:01
回答 1查看 206关注 0票数 0

我想编写一个函数,它需要使用类声明(如MyClass::class.java )的类表示形式。

我有一个基类ActivityStarter,我使用它作为活动中的伴生对象的基。

代码语言:javascript
复制
// 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作为具体化类型参数。请改为使用类”。

我过去常常在函数调用中传递参数:

代码语言:javascript
复制
// 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中使用的类型参数,这样我就可以有这样的实现?:

代码语言:javascript
复制
// 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参数,这样我就可以得到如下内容:

代码语言:javascript
复制
// 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-13 07:47:48

是否有方法使类声明中使用的类型参数具体化?

不是的。但是,如果您使startActivity不是ActivityCompanion的成员,而是一个扩展函数,以便它可以具体化类型参数,该怎么办?

代码语言:javascript
复制
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的任何子类,而没有类型参数本身,则可以将其编写为

代码语言:javascript
复制
open class ActivityStarter(protected val activityClass: Class<out AppCompatActivity>) { ... }

有关正式文件kotlin中的out关键字是什么的含义,请参阅out

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63377988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档