我正在尝试创建一种解析机制的机制,该机制位于相同的密封类中,并且基于某种类型的确定,以便能够将字符串解析为该特定类。
这是示例设置:
1)密封类:
sealed class Animal
data class Dog(
var name: String
): Animal()
data class Cat(
var color: String
): Animal()
2)将json解析为特定类的解析方法
fun parse(json: String, model: KClass<out Animal>) {
//so how to pass the type of the "model" parameter to this brackets instead of question mark?
val animal = gson.fromJson<?>(json, object : TypeToken<?>() {}.type)
//and then do something
}
所以我想我想可以像这样使用它:
json = "" //some json
parse(json, Cat::class)
如何实现?
我现在能找到的唯一方法是这样的:
fun parse(json: String, model: KClass<out Animal>) {
when (model) {
Cat::class -> {
val cat = gson.fromJson<Cat>(json, object : TypeToken<Cat>() {}.type)
//and then do something
}
Dog::class -> {
val dog = gson.fromJson<Dog>(json, object : TypeToken<Dog>() {}.type)
//and then do something
}
}
}
但是有更好的方法吗?
答案 0 :(得分:0)
您可以使用修改后的通用参数(Kotlin documentation)。
然后可以像普通类一样使用type参数:
inline fun <reified T> parse(json: String) {
val animal = gson.fromJson<T>(json, object : TypeToken<T>() {}.type)
//do somehing with the result
when(animal) {
is Dog -> ...
is Cat -> ...
}
}
//Call parse function
parse<Cat>(json)