Как создать экземпляр класса в Kotlin, если класс является параметром функции? - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь создать универсальную функцию в Kotlin, которая может каждый раз создавать экземпляры различных классов моделей.Тип класса - это параметр, который создает экземпляр из этого класса и заполняет его данными из объекта Json.

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

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы можете использовать функцию inline reified в сочетании с интерфейсом.

С помощью reified вы можете получить доступ к реальному классу параметра универсального типа.Вы по-прежнему не можете вызывать конструктор напрямую, но отражение будет работать.

Чтобы назначить id и name, вам нужно определить интерфейс, который должны реализовать все ваши классы модели:

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()
}
0 голосов
/ 28 января 2019

Вы не можете использовать само определение 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...