Kotlin 将数据类型作为参数传递给函数
我使用GSON以以下方式解析JSON: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
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()