[Kotlin] 泛型实例化

作者: 何晓杰Dev | 来源:发表于2019-06-21 18:13 被阅读21次

在 Kotlin 中,由于泛型的强化,以及阻止擦除等特性的存在,使得泛型实例化成为了可能,因此我们可以写出类似于以下的函数:

fun <T: Any> new(): T

在 Java 中要实现这类函数无疑是困难的。那么下面来看一下 Kotlin 具体要怎么做吧,首先我们必须阻止泛型擦除:

inline fun <reified T: Any> new(): T

通过 inlinereifiied 可以保证泛型类型被实化,这是实例化的基础,接着就可以写以下代码:

inline fun <reified T: Any> new(): T {
    val clz = T::class.java
    val mCreate = clz.getDeclaredConstructor()
    mCreate. isAccessible = true
    return mCreate. newInstance()
}

这就是最基础的泛型实例化了,然鹅我们经常会遇到需要带参构造的情况,没有参数的构造只能满足一小部分情况,所以加个参数吧:

inline fun <reified T: Any> new(vararg params: Any): T {
    val clz = T::class.java
    val paramTypes = params.map { it::class.java }.toTypedArray()
    val mCreate = clz.getDeclaredConstructor(*paramTypes)
    mCreate. isAccessible = true
    return mCreate. newInstance(* params)
}

那么有了这个函数之后,可以做些什么呢?比如说在 swing 下进行 UI 组件的实例化(其实就是想把代码写成 SwiftUI 2333):

fun button(text: String, block: JButton.() -> Unit) = new<JButton>(text).also(block)

fun main(args: Array<String>) {
    button("Click") {
        addActionListener { ... }
    }
}

好了,下面开始炫技:

inline fun <reified T: Any> new(vararg params: Any) =
    T::class.java.getDeclaredConstructor(*params.map { it::class.java }.toTypedArray()).apply { isAccessible = true }.newInstance(*params)

以上代码作用于 JVM 端,包括 Android 都可以使用,如果是 Kotlin/Native 下使用,可以这么来:

inline fun<reified T: CVariable> new(block: T.() -> Unit): T = memScoped { alloc<T>().also(block) }

于是我们可以在 macostarget 下,写这样的代码:

val sz = new<CGSize> {
    width = 0.0
    height = 0.0
}

这样就初始化了一个 CGSize 对象。

相关文章

  • Kotlin:泛型杂谈(下)

    在Kotlin:泛型杂谈(上)中,从泛型扩展属性、非空约束、实例化类型参数三个方面简单介绍了一下Kotlin中泛型...

  • C#动态创建实例化泛型对象,实例化新对象 new()

    普通类实例化: 泛型类实例化:(注意`1) 泛型类(多个泛型)实例化:(注意`2)

  • [Kotlin] 泛型实例化

    在 Kotlin 中,由于泛型的强化,以及阻止擦除等特性的存在,使得泛型实例化成为了可能,因此我们可以写出类似于以...

  • kotlin 获得泛型类及泛型实例化

    kotlin 这个体验也太好了

  • Kotlin 泛型

    泛型,即 "参数化类型",将类型参数化,可以用在类,接口,方法上。 与 Java 一样,Kotlin 也提供泛型,...

  • Kotlin教程 第11章 泛型

    泛型,即 "参数化类型",将类型参数化,可以用在类,接口,方法上。 与 Java 一样,Kotlin 也提供泛型,...

  • Kotlin 泛型

    泛型,即 "参数化类型",将类型参数化,可以用在类,接口,方法上。与 Java 一样,Kotlin 也提供泛型,为...

  • 泛型

    与Java泛型相同,Kotlin同样提供了泛型支持。对于简单的泛型类、泛型函数的定义,Kotlin 与 Java ...

  • Kotlin---泛型

    Kotlin不变型泛型 Kotlin的不变型泛型和Java一样,通过声明泛型类型来使用泛型类。而该种泛型声明后,则...

  • 泛型(持续更新中......)

    一、泛型类和泛型接口 1.如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型。2.要求:...

网友评论

    本文标题:[Kotlin] 泛型实例化

    本文链接:https://www.haomeiwen.com/subject/bgyuqctx.html