Как создать экземпляр класса, передав тип - PullRequest
0 голосов
/ 17 июня 2020

Я хочу иметь возможность сказать «создать экземпляр этого класса» и указать тип, тогда код может создать экземпляр нового экземпляра этого класса.

Ответы [ 4 ]

2 голосов
/ 17 июня 2020

Если все они имеют конструкторы с нулевым аргументом, вы можете:

fun maker(type: Class<Animal>): Animal {
    return type.newInstance()
}

Вы можете заставить его возвращать тип, который был передан для большей универсальности:

fun <T: Animal> maker(type: Class<T>): T {
    return type.newInstance()
}
1 голос
/ 17 июня 2020

Правильная версия по вашему примеру (не уверен, что лучший подход в целом):

fun <T: Animal> maker(type: Class<T>): T? {
    return when (type) {
      Cat::class.java -> Cat() as T
      Dog::class.java -> Dog() as T
      else -> null
    }
}

А затем для создания объектов:

val a = maker(Cat::class.java)
val b = maker(Dog::class.java)
0 голосов
/ 17 июня 2020

Если функция может быть inline, вы также можете использовать reified type

inline fun<reified T: Animal> make() = T::class.createInstance()

...

val dog = make<Dog>()

Обратите внимание, что для использования createInstance() класс должен иметь конструктор no-arg или IllegalArgumentException будет брошено

0 голосов
/ 17 июня 2020

(Обновлено) Я не эксперт в Kotlin, но вы можете сделать что-то вроде этого:

import kotlin.reflect.KClass
import kotlin.reflect.full.createInstance

class A {
    fun greet() {
        println("Hello A");
    }
}

class B{
    fun greet() {
        println("Hello B");
    }
}

fun <T : Any> maker(clazz: KClass<T>): T {
    return clazz.createInstance();
}

val aObj = maker<A>(A::class);
aObj.greet();

val bObj = maker<B>(B::class);
bObj.greet();

Вывод:

Hello A
Hello B

Надеюсь, теперь это имеет смысл для вас просто нужно передать класс методу, и он вернет объект.

Поскольку вы будете использовать Animal в качестве родительского класса, вы можете заменить Any => Animal

fun <T : Animal> maker(clazz: KClass<T>): T {
    return clazz.createInstance();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...