我想從 SharedPreferences 獲取字串,然后使用泛型將其轉換為某個類。我有這個代碼:
fun <T> get(key: String): T? {
val value = sharedPreferences.getString(key, "") ?: ""
(value as? T)?.let { return it }
return if (value.isNotEmpty()) {
try {
Gson().fromJson(value, object : TypeToken<T>() {}.type)
} catch (exc: Exception) {
null
}
} else {
null
}
}
我這樣稱呼這個函式:
preferences.get<UserInfoBuilder>(PreferencesCoreKeys.USER_INFO)
但在get樂趣中,我看到那(value as? T)只是一個字串。打電話object : TypeToken<T>() {}.type給我一個錯誤“關于型別的資訊不足”。如何讓它發揮作用?
uj5u.com熱心網友回復:
強制轉換不會將型別轉換為其他型別。您正在使用的實體已經是其他型別,這只是您向編譯器做出的承諾。
如果你呼叫sharedPreferences.getString,你總是會得到一個回傳的字串。Any除了它已經是的型別( , CharSequence,Comparable<String>或這些型別的可空版本)之外,您無法成功地將字串轉換為任何東西。因此,即使使用具體型別,as? T除非 T 是其中之一,否則強制轉換總是會失敗。如果沒有具體型別,它將在呼叫站點成功,然后當您嘗試將實體用作字串以外的其他內容時會崩潰。
而且 Gson 必須知道您請求的具體型別,因此您需要使用具體化的泛型。
inline fun <reified T> get(key: String): T? {
val value = sharedPreferences.getString(key, "") ?: ""
return if (T::class == String::class) {
value as T
} else {
try { Gson().fromJson(value, T::class.java) }
catch(e: Exception) { null }
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516376.html
標籤:安卓科特林仿制药
