Kotlin-通用类型安全,错误警告? java.lang.ClassCastException

时间:2019-03-14 06:36:38

标签: android generics kotlin

我正在从某个 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) } } 函数

1 个答案:

答案 0 :(得分:0)

在编译时将擦除通用类型T,因此在运行时不提供类型信息。

object : TypeToken<ArrayList<T>>() {}.type

这就是Gson不转换为Response类的原因。 您可以使用inlinereified来避免类型擦除。

inline fun <reified T> getAsList(input: String): ArrayList<T>