Kotlin 类型未被推断为泛型函数

Kotlin type is not inferred into generic function

我有一个通用函数 fetch/get SharedPreferences 中的任何列表。但是,当我想测试时,它不起作用,当我保存一个消息列表并请求一个消息列表时,它仍然有效。它只是忽略了我确定的类型并 return 编辑了一个 JsonObjects 列表。当我调试整个代码时,我发现,显然该函数并不关心推断的 class 类型。我先把代码放在这里,这样我就可以解释问题了:

fun <T> getListFromPreferences(preferences : SharedPreferences, key : String)
        : MutableList<T> {
            val listAsString = preferences.getString(key, "")
            val type: Type = object : TypeToken<List<T>>() {}.type
            val gson = SMSApi.gson
            return gson.fromJson<ArrayList<T>>(listAsString, type)
                    ?: ArrayList()
        }

所以,我所期望的是,当我这样调用函数时:

PreferenceHelper.getListFromPreferences<Message>(preferences, TEST_KEY)

上面代码中的“type”变量应该return列出来。但是调试器显示给我的结果是:java.util.List<? extends T> 我完全不知道为什么推断不起作用,但我真的很希望它能确保我所要求的实际上是我得到的,原因很明显。 有人知道这种奇怪行为的原因和解决方案吗?

由于 type erasure,关于 T 的实际类型信息丢失了,所以基本上这个方法 returns List<Any?> (即使你将 Int 作为T).

要保留实际类型,您需要使用具体化参数声明此方法:

inline fun <reified T>  getListFromPreferences(preferences : SharedPreferences, key : String) 
        : MutableList<T> { 
  //... 
}