我正在从某个 API 获取响应,获得响应后,我将其转换为所需的df1 = pd.merge(df1, df2[['PersonID', 'Infected']], on=['PersonID'], how='left').fillna(False)
的列表,例如:
df1 = df1.merge(df2[['PersonID', 'Infected']], on=['PersonID'], how='left').fillna(False)
然后我将此列表传递到某个地方,例如:
Object
通过覆盖此方法,我可以获得结果,例如:
fun <T> getAsList(input: String): ArrayList<T> {
val objType = object : TypeToken<ArrayList<T>>() {}.type
val result = Gson().fromJson(input, objType) as ArrayList<T>
println(result[0]) // <-- no warning here !! It's work
println("result: " + result.toString()) // Also it's work here
return result
}
如上所述,添加到updateFromDownload(getAsList<T>(resultValue))
可以正常工作,但是如果我尝试像在override fun updateFromDownload(result: List<Response>?) {
val listTest = ArrayList<Response>()
listTest.add(result!![0]) // <-- This work
println(listTest)
println("resss:" + result[0]) // <-- This not work !!!
for (response in result){
// The loop crash too, not work
}
中那样单独获取元素,则由于以下原因而崩溃:
java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法转换为......响应
是否可以直接访问listTest
而不将其填写到新列表中?
编辑-代码的整个周期:
getAsList()
然后我从以下位置调用result
:
class ConnectToURL<T>(callback: DownloadCallback<T>) : AsyncTask<String, Int, ConnectToURL.Result>() {
private var mCallback: DownloadCallback<T>? = null
init {
setCallback(callback)
}
override fun onPostExecute(result: Result?) {
mCallback?.apply {
result?.mException?.also { exception ->
//val gson = Gson().fromJson(result.mResultValue!!, type)
//updateFromDownload(gson)
return
}
result?.mResultValue?.also { resultValue ->
updateFromDownload(getAsList<T>(resultValue))
return
}
finishDownloading()
}
}
}
然后我覆盖ConnectToURL
中的 class BuilderClass<T> private constructor(
callback: DownloadCallback<T>,
private val url: String
) {
init {
ConnectToURL(callback).execute(url)
}
/// some code . . .. .
fun build() = BuilderClass(callback, url)
}
}
函数
答案 0 :(得分:0)
在编译时将擦除通用类型T
,因此在运行时不提供类型信息。
object : TypeToken<ArrayList<T>>() {}.type
这就是Gson不转换为Response
类的原因。
您可以使用inline
加reified
来避免类型擦除。
inline fun <reified T> getAsList(input: String): ArrayList<T>