【发布时间】:2021-06-06 08:20:30
【问题描述】:
我有一个像下面这样的通用方法
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 我举了一个例子,希望能解释我想做什么
标签: generics kotlin parameter-passing generic-type-argument