Kotlin 将数据类型作为参数传递给函数

Kotlin 将数据类型作为参数传递给函数,kotlin,reflection,Kotlin,Reflection,我使用GSON以以下方式解析JSON: var obj = Gson().fromJson( json, Array<MyDataModel>::class.java ).toList() fun convert( t : Any ) : Any { return Gson().fromJson( mockedResponse, t ).toList() } val model = convert( Array<MyDataModel>::class.java

我使用GSON以以下方式解析JSON:

var obj = Gson().fromJson( json, Array<MyDataModel>::class.java ).toList()
fun convert( t : Any ) : Any
{
    return Gson().fromJson( mockedResponse, t ).toList()
}

val model = convert( Array<MyDataModel>::class.java )

我还尝试将Type作为参数数据类型,但相同的错误仍然存在。如何将数据类型传递给convert方法?谢谢

恐怕您必须在这里使用泛型:

比如:

inline fun <T, reified R>convert( t : T ) : R {
    return Gson().fromJson(t, R::class.java )
}
inline fun convert(t:t):R{
返回Gson().fromJson(t,R::class.java)
}

恐怕您必须在这里使用泛型:

比如:

inline fun <T, reified R>convert( t : T ) : R {
    return Gson().fromJson(t, R::class.java )
}
inline fun convert(t:t):R{
返回Gson().fromJson(t,R::class.java)
}

这里发生了几件事

首先,传递类型的传统方法是传递其对象(使用
::type
)或对象(使用
::type.class

因此,您可以将函数声明为:

fun convert(t: Class<*>): Any
这指定您传递的类型必须是
集合的某个实现
,并且它返回具有相同元素类型的
列表。因为
Collection
有一个
toList()
方法,所以它都可以工作

但是,对于传递
数组
类型的情况,这是行不通的,因为数组没有
toList()
方法。(
数组
类型在Kotlin中有点笨拙。它们主要用于与Java的向后兼容性;
列表
在许多方面都更好。)

您可以使用上述方法,并直接使用列表类型。但是,您将无法指定列表元素类型:

fun <T: Collection<U>, U> convert(t: Class<T>): List<U> {
    return Gson().fromJson(mockedResponse, t).toList()
}

val model: List<*> = convert(List::class.java)
fun <T> convert(t: Class<T>): T {
    return Gson().fromJson(mockedResponse, t)
}

val model: List<MyDataModel> = convert(Array<MyDataModel>::class.java).toList()
作为最后的调整,我们可以使用Kotlin的另一种稍微简洁的方法来传递类型:使它们具体化。这种替换是在编译时完成的,而不是在运行时完成的,并且只适用于
内联
函数:

inline fun <reified T> convert(): T {
    return Gson().fromJson(mockedResponse, T::class.java)
}

val model: List<MyDataModel> = convert<Array<MyDataModel>>().toList()
inline fun convert():T{
返回Gson().fromJson(mockedResponse,T::class.java)
}
val模型:List=convert().toList()

这里发生了几件事

首先,传递类型的传统方法是传递其对象(使用
::type
)或对象(使用
::type.class

因此,您可以将函数声明为:

fun convert(t: Class<*>): Any
这指定您传递的类型必须是
集合的某个实现
,并且它返回具有相同元素类型的
列表。因为
Collection
有一个
toList()
方法,所以它都可以工作

但是,对于传递
数组
类型的情况,这是行不通的,因为数组没有
toList()
方法。(
数组
类型在Kotlin中有点笨拙。它们主要用于与Java的向后兼容性;
列表
在许多方面都更好。)

您可以使用上述方法,并直接使用列表类型。但是,您将无法指定列表元素类型:

fun <T: Collection<U>, U> convert(t: Class<T>): List<U> {
    return Gson().fromJson(mockedResponse, t).toList()
}

val model: List<*> = convert(List::class.java)
fun <T> convert(t: Class<T>): T {
    return Gson().fromJson(mockedResponse, t)
}

val model: List<MyDataModel> = convert(Array<MyDataModel>::class.java).toList()
作为最后的调整,我们可以使用Kotlin的另一种稍微简洁的方法来传递类型:使它们具体化。这种替换是在编译时完成的,而不是在运行时完成的,并且只适用于
内联
函数:

inline fun <reified T> convert(): T {
    return Gson().fromJson(mockedResponse, T::class.java)
}

val model: List<MyDataModel> = convert<Array<MyDataModel>>().toList()
inline fun convert():T{
返回Gson().fromJson(mockedResponse,T::class.java)
}
val模型:List=convert().toList()