KotlinJs直接演员表失败,而通用演员表演工作

时间:2017-08-10 19:33:08

标签: kotlin-js-interop

不确定这是否是类型广告中的差异或我使用错误。直接投射会抛出错误,但使用通用强制转换将使我的代码工作。

下面我试图将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()

我们应该一直使用Generic cast吗?或者有没有正确的方法来做到这一点?

0 个答案:

没有答案