不确定这是类型转换的差异还是我使用错误。直接转换会引发错误,但使用泛型转换将使我的代码正常工作。
下面我试图将 Json 投射到Person
import kotlin.js.Json
data class Person(val name: String)
fun main(args: Array<String>) {
val persons: Json = JSON.parse("""{ "p1": { name: "foo" } } """)
val p1: Person = persons.get("p1") as Person // throws ClassCastException("Illegal cast")
fun <T> Json.typedGet(s: String): T = this.get(s) as T
val p2: Person = persons.typedGet("p1") // but this works!!
}
直接转换似乎生成检查实际Person
类的代码
val p1: Person = persons.get("p1") as Person
// generated javascript (note type check with *Person*)
// var p1 = Kotlin.isType(tmp$ = persons['p1'], Person) ? tmp$ : Kotlin.throwCCE()
通用演员似乎生成检查与Any
fun <T> Json.typedGet(s: String): T = this.get(s) as T
val p2: Person = persons.typedGet("p1")
// generates javascript (note type check with *Any*)
// var p1 = Kotlin.isType(tmp$ = persons['p1'], Any) ? tmp$ : Kotlin.throwCCE()
我们应该一直使用通用演员吗?还是有一些正确的方法可以做到这一点?