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> {
//...
}
我有一个通用函数 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> {
//...
}