Điều này giải quyết vấn đề:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Dòng đầu tiên tạo một biểu thức đối tượng giảm dần TypeToken
và sau đó lấy Java Type
từ đó. Sau đó, Gson().fromJson
phương thức cần kiểu được chỉ định cho kết quả của hàm (phải khớp với kiểu TypeToken
được tạo). Hai phiên bản của tác phẩm này, như trên hoặc:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Để tạo dễ dàng hơn, TypeToken
bạn có thể tạo một hàm trợ giúp, hàm này được yêu cầu phải nội tuyến để có thể sử dụng các tham số kiểu đã sửa đổi :
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Sau đó, có thể được sử dụng theo một trong hai cách sau:
val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()
Và toàn bộ quá trình có thể được bao bọc thành một hàm mở rộng cho Gson
ví dụ:
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
Vì vậy, bạn có thể chỉ cần gọi cho Gson và không phải lo lắng về TypeToken
:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Ở đây Kotlin đang sử dụng kiểu suy luận từ một phía của nhiệm vụ hoặc mặt khác, và các tổng thể được sửa đổi cho một hàm nội tuyến để chuyển qua kiểu đầy đủ (không tẩy xóa) và sử dụng kiểu đó để tạo một TypeToken
và cũng thực hiện lệnh gọi tới Gson
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type