作為一種靜態(tài)類(lèi)型的語(yǔ)言,Kotlin仍然需要與無(wú)類(lèi)型或松散類(lèi)型的環(huán)境(例如
JavaScript生態(tài)系統(tǒng))進(jìn)行互操作。為了方便這些使用場(chǎng)景,語(yǔ)言中有 dynamic 類(lèi)型可用:
val dyn: dynamic = ……
在面向 JVM 平臺(tái)的代碼中不支持動(dòng)態(tài)類(lèi)型
dynamic 類(lèi)型基本上關(guān)閉了 Kotlin 的類(lèi)型檢查系統(tǒng):
dynamic 類(lèi)型的變量,或者傳遞給一個(gè)接受 dynamic 作為參數(shù)的函數(shù),null-檢查對(duì)這些值是禁用的。dynamic 最特別的特性是,我們可以對(duì) dynamic 變量調(diào)用任何屬性或以任意參數(shù)調(diào)用任何函數(shù)
:
dyn.whatever(1, "foo", dyn) // “whatever”在任何地方都沒(méi)有定義
dyn.whatever(*arrayOf(1, 2, 3))
在 JavaScript 平臺(tái)上,該代碼將按照原樣編譯:在生成的 JavaScript 代碼中,Kotlin中的 dyn.whatever(1) 變?yōu)?dyn.whatever(1)
。
當(dāng)在 dynamic 類(lèi)型的值上調(diào)用 Kotlin 寫(xiě)的函數(shù)時(shí),請(qǐng)記住由
Kotlin 到 JavaScript 編譯器執(zhí)行的名字修飾。你可能需要使用 @JsName 注解
為要調(diào)用的函數(shù)分配明確的名稱(chēng)。
動(dòng)態(tài)調(diào)用總是返回 dynamic 作為結(jié)果,所以我們可以自由地這樣鏈接調(diào)用:
dyn.foo().bar.baz()
當(dāng)我們把一個(gè) lambda 表達(dá)式傳給一個(gè)動(dòng)態(tài)調(diào)用時(shí),它的所有參數(shù)默認(rèn)都是 dynamic 類(lèi)型的:
dyn.foo {
x -> x.bar() // x 是 dynamic
}
使用 dynamic 類(lèi)型值的表達(dá)式會(huì)按照原樣轉(zhuǎn)換為 JavaScript,并且不使用 Kotlin 運(yùn)算符約定。
支持以下運(yùn)算符:
+、 -、 *、 /、 %、 >、 <、 >=、 <=、 ==、 !=、 ===、 !==、 &&、 ||-、 +、 !++、 --+=、 -=、 *=、 /=、 %=d[a],多于一個(gè)參數(shù)會(huì)出錯(cuò)d[a1] = a2,[] 中有多于一個(gè)參數(shù)會(huì)出錯(cuò)in、 !in 以及 .. 操作對(duì)于 dynamic 類(lèi)型的值是禁用的。
更多技術(shù)說(shuō)明請(qǐng)參見(jiàn)規(guī)范文檔。