And*_*rov 1 generics android kotlin
我正在尝试在 kotlin 中创建一个通用工厂,用于将某些字符串解析为模型类:
internal interface Model
data class UserId(val id: String, val name: String, val link: String): Model
data class Shelf(val id: String, val name: String, val bookCount: Int): Model
internal inline fun <reified T: Model> getParser(): Parser<T> {
return when (T::class) {
UserId::class -> UserIdParser() as Parser<T>
Shelf::class -> UserShelvesParser() as Parser<T>
else -> throw Exception("can't match proper parser")
}
}
internal interface Parser<out T: Model> {
fun parse(xml: String): T
}
internal class UserIdParser : Parser<UserId> {
override fun parse(xml: String): UserId {
return parseUserId(xml)
}
}
internal class UserShelvesParser : Parser<Shelf> {
override fun parse(xml: String): Shelf {
return parseShelf(xml)
}
}
// for example
internal fun parseUserId(xml: String) = UserId("123", "owl", "ya.ru")
internal fun parseShelf(xml: String) = Shelf("123", "to-read", 20)
Run Code Online (Sandbox Code Playgroud)
所以在客户端代码中,我可以这样写:
val t = getParser<UserId>().parse("")
Run Code Online (Sandbox Code Playgroud)
它有效,但在getParser方法中我收到了 warning Unchecked cast from UserIdParser to Parser<T>。如果没有惯用的警告,我怎样才能在 kotlin 中实现这种行为呢?
这与您的目标略有不同,但它的工作原理没有任何警告:
internal interface Model
data class UserId(val id: String, val name: String, val link: String) : Model
data class Shelf(val id: String, val name: String, val bookCount: Int) : Model
internal inline fun <reified T : Model> parse(xml: String) = when (T::class) {
UserId::class -> parseUserId(xml)
Shelf::class -> parseShelf(xml)
else -> throw Exception("can't match proper parser")
} as T
// for example
internal fun parseUserId(xml: String) = UserId("123", "owl", "ya.ru")
internal fun parseShelf(xml: String) = Shelf("123", "to-read", 20)
Run Code Online (Sandbox Code Playgroud)
那么它可以这样调用:
val t = parse<UserId>("")
Run Code Online (Sandbox Code Playgroud)
希望这可以帮到你。
| 归档时间: |
|
| 查看次数: |
2076 次 |
| 最近记录: |