如果类是函数的参数,如何在Kotlin中实例化类?

时间:2019-01-28 02:12:00

标签: kotlin

我试图在Kotlin中实现通用功能,该功能可以在每次不同的模型类时实例化。 类类型是一个参数,用于从该类中创建实例并用Json对象的数据填充它。

fun<T> foo() {
    var myModel = T()
    myModel.id = 2
    myModel.name = ""
}

2 个答案:

答案 0 :(得分:4)

您可以将inline reified函数与界面结合使用。

使用reified,您可以访问通用类型参数的实型。 您仍然不允许直接调用该构造函数,但可以进行反射。

要分配idname,您需要定义一个接口,所有模型类都必须实现:

interface Model {
    var id: Int?
    var name: String?
}

inline fun <reified T : Model> createModel() : T {
    val myModel = T::class.createInstance()
    myModel.id = 2
    myModel.name = ""
    return myModel
}

一个简单的例子:

class TestModel() :  Model {
    override var id: Int? = null
    override var name: String? = null
}

fun main() {
    val model: TestModel = createModel()
}

答案 1 :(得分:0)

您不能使用T定义本身,而是将类传递给函数。

import kotlin.reflect.KClass

open class Model {
    var id: Int? = null
    var name: String? = null
    fun say() {
        println("hello.")
    }
}
class MyModel: Model()

fun<T: Model> foo(type: KClass<T>): T {
    val myModel = type.java.newInstance()
    myModel.id = 2
    myModel.name = ""
    return myModel
}

val mymodel = foo(MyModel::class)
mymodel.say() // hello.