Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果类是函数的参数,如何在Kotlin中实例化类?_Kotlin - Fatal编程技术网

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

如果类是函数的参数,如何在Kotlin中实例化类?,kotlin,Kotlin,我试图在Kotlin中创建通用函数,它可以在每次实例化不同的模型类时进行实例化。 类类型是一个参数,用于从该类生成实例并用Json对象中的数据填充它 fun<T> foo() { var myModel = T() myModel.id = 2 myModel.name = "" } 不能使用T定义本身,而是将类传递给函数 import kotlin.reflect.KClass open class Model { var id: Int? =

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

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

不能使用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.

不能使用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.
您可以将函数与接口结合使用

使用reified,您可以访问泛型类型参数的真实类。 您仍然不允许直接调用构造函数,但反射将起作用

要分配id和名称,您需要定义一个接口,所有模型类都需要该接口来实现:

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
}
您可以将函数与接口结合使用

使用reified,您可以访问泛型类型参数的真实类。 您仍然不允许直接调用构造函数,但反射将起作用

要分配id和名称,您需要定义一个接口,所有模型类都需要该接口来实现:

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
}

这就是java的方式。在Kotlin中,我们更愿意使用@ReneThx提到的带有具体化类型参数的内联函数!你和@Rene也帮了我。这是java的方式。在Kotlin中,我们更愿意使用@ReneThx提到的带有具体化类型参数的内联函数!你们和@Rene也帮了我。若类并没有参数构造函数呢?若类并没有参数构造函数呢?