官方文檔: http://kotlinlang.org/docs/reference/dynamic-type.html
動態類型(Dynamic Type)
Kotlin在面向JVM平臺的代碼中不支持動態類型(說白了就是java不支持動態類型)
Kotlin是一種靜態類型的語言,但仍然需要與無類型或松散類型的語言互操作(例如JavaScript系統)!
為了幫助這些場景,kotLin語言中可用dynamic類型:
val dyn: dynamic = ...
dynamic類型基本關閉了Kotlin類型檢查系統:
dynamic類型類型的值可以賦值給任何變量或作為參數傳遞到任何位置;
任何值都可以賦值給dynamic類型變量,或者傳遞給一個接受dynamic作為參數的函數;
null檢查禁用;
dynamic最特別的特性是,可以對dynamic變量調用任何屬性或以任意參數調用任何函數:
val dyn: dynamic = ...
dyn.whatever(1, "foo", dyn) // 'whatever'沒有定義
dyn.whatever(*arrayOf(1, 2, 3))
在JavaScript平臺上,該kotlin代碼按原樣編譯: 在生成的JavaScript代碼中,Kotlin的dyn.whatever(1)變為dyn.whatever(1)
當在dynamic類型的值上調用,可能需要使用@JsName注解為要調用的函數分配名稱!
函數動態調用總是返回dynamic,所以可以自由地鏈式調用:
dyn.foo().bar.baz()
把lambda表達式傳給一個動態調用時,它的所有參數默認都是dynamic類型:
dyn.foo {
x -> x.bar() // x 是 dynamic
}
使用dynamic類型值的表達式會按原樣轉換為JavaScript,并且不使用Kotlin約定的運算符,支持以下運算符:
二元(binary): +, -, *, /, %, >, < >=, <=, ==, !=, ===, !==, &&, ||
一元(unary)
前置(prefix): -, +, !
前置及后置(postfix): ++, --
賦值(assignments): +=, -=, *=, /=, %=
索引訪問(indexed access):
讀(read): d[a], []多于一個參數會出錯
寫(write): d[a1] = a2, []多于一個參數會出錯
注意: in, !in以及..操作符,對于dynamic類型是被禁用(在JavaScript平臺被禁用)!
簡書:http://www.lxweimin.com/p/5f07f026edcf
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/75579094
GitHub博客:http://lioil.win/2017/07/20/Kotlin-JS-dynamic-type.html
Coding博客:http://c.lioil.win/2017/07/20/Kotlin-JS-dynamic-type.html