Kotlin動態類型
作爲一種靜態類型的語言,Kotlin仍然需要與無類型或鬆散類型的環境(例如
JavaScript生態系統)進行互操作。爲了方便這些使用場景,語言中有 dynamic
類型可用:
val dyn: dynamic = ……
在面向 JVM 平臺的代碼中不支持動態類型
dynamic
類型基本上關閉了 Kotlin 的類型檢查系統:
- 該類型的值可以賦值給任何變量或作爲參數傳遞到任何位置,
- 任何值都可以賦值給
dynamic
類型的變量,或者傳遞給一個接受dynamic
作爲參數的函數, -
null
-檢查對這些值是禁用的。
dynamic
最特別的特性是,我們可以對 dynamic
變量調用任何屬性或以任意參數調用任何函數
:
dyn.whatever(1, "foo", dyn) // 「whatever」在任何地方都沒有定義
dyn.whatever(*arrayOf(1, 2, 3))
在 JavaScript 平臺上,該代碼將按照原樣編譯:在生成的 JavaScript 代碼中,Kotlin中的 dyn.whatever(1)
變爲 dyn.whatever(1)
。
當在 dynamic
類型的值上調用 Kotlin 寫的函數時,請記住由
Kotlin 到 JavaScript 編譯器執行的名字修飾。你可能需要使用 @JsName 註解
爲要調用的函數分配明確的名稱。
動態調用總是返回 dynamic
作爲結果,所以我們可以自由地這樣鏈接調用:
dyn.foo().bar.baz()
當我們把一個 lambda 表達式傳給一個動態調用時,它的所有參數默認都是 dynamic
類型的:
dyn.foo {
x -> x.bar() // x 是 dynamic
}
使用 dynamic
類型值的表達式會按照原樣轉換爲 JavaScript,並且不使用 Kotlin 運算符約定。
支持以下運算符:
- 二元:
+
、-
、*
、/
、%
、>
、<
、>=
、<=
、==
、!=
、===
、!==
、&&
、||
- 一元
- 前置:
-
、+
、!
- 前置及後置:
++
、--
- 前置:
- 賦值:
+=
、-=
、*=
、/=
、%=
- 索引訪問:
- 讀:
d[a]
,多於一個參數會出錯 - 寫:
d[a1] = a2
,[]
中有多於一個參數會出錯
- 讀:
in
、 !in
以及 ..
操作對於 dynamic
類型的值是禁用的。
更多技術說明請參見規範文檔。