Kotlin(十九) 泛型的高级特性

2023-12-16 08:42:04

实化泛型

怎么写才能将泛型实化呢?首先,该函数必须是内联函数才行,也就是要用inline关键字来修饰该函数。其次,在声明泛型的地方必须加上reified关键字来表示该泛型要进行实化。示例代码如下:

inline fun <reified T> getGenericType(){
    
}

上述函数中的泛型T就是一个被实化的泛型,因为它满足了内联函数和reified关键字这两个前提条件。那么借助泛型实化,到底可以实现什么样的效果呢?从函数名就可以看出来了,这里我们准备实现一个获取泛型实际类型的功能,代码如下所示:

inline fun <reified T> getGenericType() = T::class.java

虽然只有一行代码,但是这里却实现了一个Java中完全不可能实现的功能:getGenericType()函数直接返回了当前指定泛型的实际类型。T.class这样的语法在Java中是不合法的,而在Kotlin中,借助泛型实化功能就可以使用T::class.java这样的语法了。

现在我们可以使用如下代码对getGenericType()函数进行测试:

    val test1 = getGenericType<String>()

    val test2 = getGenericType<Int>()

泛型实化的应用

在我们实现ActivityA-->ActivityB时,我们需要这样写:

        val intent= Intent(applicationContext,ExampleActivity::class.java)
        startActivity(intent)

这是很常见的一种写法,但是我们如果使用泛型实化来简化它呢?那么我们就可以这样写:

inline fun <reified T> myStartActivity(context: Context) {
    val intent = Intent(context, T::class.java)
    context.startActivity(intent)
}

那么我们调用:

myStartActivity<ExampleActivity>(applicationContext)

当然,一般我们跳转Activity是需要传参数的,那么我们可以进一步完善我们的方法:

inline fun <reified T> myStartActivity(context: Context, block: Intent.() -> Unit) {
    val intent = Intent(context, T::class.java)
    intent.block()
    context.startActivity(intent)
}

调用:

        myStartActivity<ExampleActivity>(applicationContext){
            putExtra("param1","value")
            putExtra("param2",2)
        }

文章来源:https://blog.csdn.net/pengguichu/article/details/135023613
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。