我收到一个带有地图包装器的 JSON 数据模型Table。我试图使用泛型来传递超出包装器的类型,但它在运行时翻译得不好。这是我的 JSON 文件的示例:
{
"Table": [
{
"paymentmethod_id": 1,
"paymentmethod_description": "Cash",
"paymentmethod_code": "Cash",
"paymentmethod_is_ach_onfile": false,
"paymentmethod_is_element": false,
"paymentmethod_is_reward": false,
"paymentmethod_is_openedgeswipe": false,
"paymentmethod_update_user_id": 1,
"paymentmethod_insert_user_id": 1,
"paymentmethod_insertdate": "2014-10-07 14:53:16",
"paymentmethod_deleted": false,
"paymentmethod_is_mobile_visible": true
}
]
}
我使用的包装类称为 Table。
data class Table<T>(
@SerializedName("Table") val models : Array<T>
)
实际的模型类是 PaymentMethod。
data class PaymentMethod(
@SerializedName("paymentmethod_id") val idNumber : Int = -1
)
我创建了一个采用 类型的通用数据管理器类。我认为使用数据管理器的子类来本地化输入和结果(例如声明模型类付款方式.
open class NXDataManager<T>(manager: NXNetworkManager? = null, rpc : String?, parameters: List<Pair<String, String>>? = null, method : String = "get")
{
...
open fun sendRequest(completionHandler: (models:Array<T>) -> Unit, errorHandler: (error:FuelError) -> Unit) {
val request = NXNetworkRequest(rpc, parameters, method)
request.send(manager, completionHandler = { s: String ->
val table: Table<T> = Gson().fromJson(s)
completionHandler(table.models)
}, errorHandler = errorHandler)
}
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
}
我的子类数据管理器指定要解析的模型。
final public class PaymentMethodsDataManager : NXDataManager<PaymentMethod>
{
constructor () : super("genGetPaymentMethods")
}
当我运行代码时:
val table: Table<T> = Gson().fromJson(s)
我收到一条错误消息java.lang.ClassCastException:java.lang.Object[]无法转换为Networking.PaymentMethod[]。但是,当我传入显式类型时,它会按预期工作——将数组解析为 PaymentMethod 模型:
val table: Table<PaymentMethod> = Gson().fromJson(s)
关于如何仍然使用泛型类型 T 有什么想法吗?