У меня есть общий метод, как показано ниже
private fun <T> getSomething(): T {
return "something" as T
}
Как я могу вызвать этот метод с переменной типа T?
val types = arrayListOf<Type>(String::class.java, Boolean::class.java)
types.forEach { type ->
val something = getSomething<type>() // Unresolved reference: type
}
Во время выполнения я не знаю, что было бы общим типом T. Я получаю тип от types и должен передать его обычным методом getSomething.
Я хочу вызвать базу данных, в которой есть несколько таблиц. Примеры моделей выглядят так
class User{
}
class Student{
}
Поскольку все вызывающие запросы в основном одинаковы, я хочу иметь общий метод для вызова базы данных и получения данных.
private fun <T> getData(model: String): List<T>?{
return when(model){
"user" -> getUsers()
"student" -> getStudents()
else -> null
}
}
Итак, когда я вызываю вышеупомянутый метод. В моем цикле я хочу передать Type либо как User, либо как Student.
val types = arrayListOf<Type>(User::class.java, Student::class.java)
types.forEach { type ->
val data = getData<type>(type.javaClass.simpleName) // Unresolved reference: type in <type>
}
Как мне этого добиться.
Почему вы хотите называть его «именем класса переменной»? Что ты хочешь с этим делать? Поскольку универсальные шаблоны могут использоваться только для проверки статического типа, а переменная по определению не является статической, вы ничего не можете сделать с универсальным типом переменной. (Единственным исключением является универсальный тип reified для встроенной функции, но вы его не используете)
@ErwinBolwidt Это не обязательно должно быть «имя класса переменной». Я немного отредактировал пример. Итак, у меня есть список классов, и я должен передать его оттуда в метод getSomething. Если с reified можно, то как с этим делать?
Что ты хочешь с этим делать? Что вы хотите сделать с something, для которого требуется эта функция? Пожалуйста, покажите это в своем коде.
@ErwinBolwidt Я включил пример, который, надеюсь, объясняет, что я хочу делать

Вот полный пример:
import kotlin.reflect.KClass
data class User(val name: String)
data class Student(val name: String)
fun getUsers(): List<User> = listOf(User("JB"))
fun getStudents(): List<Student> = listOf(Student("Claire"))
fun <T: Any> getData(clazz: KClass<T>): List<T>? {
return when(clazz) {
User::class -> getUsers() as List<T>
Student::class -> getStudents() as List<T>
else -> null
}
}
fun main(args: Array<String>) {
val types = listOf(User::class, Student::class)
types.forEach { type ->
val data = getData(type)
println(data)
}
}
тогда у вас будут данные val как List <Any>, и вам нужно будет угадать, к какому типу они должны быть приведены для дальнейшего использования. Так в чем смысл?
Это то, что вам следует спросить у ОП, а не у меня. Но у вас это будет только в таком цикле, где вы хотите делать то же самое, независимо от типа. Если вы знаете тип и используете getData (Student :: class), вы получите List <Student>, а не List <Any>.
Я проверил это в Idea - в вашем случае данные val - это List <Any?>
Нет, это List <Any>?. Ну и что? Как я уже сказал, здесь вы хотите делать то же самое, независимо от типа, но вы не знаете фактический тип. Если вы это сделаете и используете val data = getData(Student::class), вы получите List <Student>?.
> используйте val data = getData (Student :: class), вы получите List <Student>? Да, вы правы. Но если вы знаете тип и задаете его явно, чем он отличается от прямого вызова "getStudents"?
У меня тут похожая проблема Модуляризация для создания функции с переменными типами в Kotlin. Не могли бы вы помочь.
Я бы остановился на конкретных типах, таких как
import kotlin.reflect.KClass
interface IBaseData
interface IDataTable<out T> where T : IBaseData
{
fun getData(): List<T>
}
class User : IBaseData
class Student : IBaseData
class UserTable : IDataTable<User>
{
override fun getData(): List<User>
{
return listOf(User())
}
}
class StudentTable : IDataTable<Student>
{
override fun getData(): List<Student>
{
return listOf(Student())
}
}
inline fun <reified T: IBaseData> getDataTable() : IDataTable<T>?
{
return when(T::class)
{
User::class -> UserTable() as IDataTable<T>
Student::class -> StudentTable() as IDataTable<T>
else -> null
}
}
fun main()
{
var user = getDataTable<User>()?.getData()
var student = getDataTable<Student>()?.getData()
}
Но все же это накладные расходы, почему бы не использовать напрямую getUser() или getStudents()
У меня тут похожая проблема Модуляризация для создания функции с переменными типами в Kotlin. Не могли бы вы помочь.
из приведенного выше примера, вы не передаете тип, вместо этого вы возвращаете тип. Что на самом деле вы хотите ??