官方文檔: http://kotlinlang.org/docs/reference/dynamic-type.html
動(dòng)態(tài)類型(Dynamic Type)
Kotlin在面向JVM平臺(tái)的代碼中不支持動(dòng)態(tài)類型(說(shuō)白了就是java不支持動(dòng)態(tài)類型)
Kotlin是一種靜態(tài)類型的語(yǔ)言,但仍然需要與無(wú)類型或松散類型的語(yǔ)言互操作(例如JavaScript系統(tǒng))!
為了幫助這些場(chǎng)景,kotLin語(yǔ)言中可用dynamic類型:
val dyn: dynamic = ...
dynamic類型基本關(guān)閉了Kotlin類型檢查系統(tǒng):
dynamic類型類型的值可以賦值給任何變量或作為參數(shù)傳遞到任何位置;
任何值都可以賦值給dynamic類型變量,或者傳遞給一個(gè)接受dynamic作為參數(shù)的函數(shù);
null檢查禁用;
dynamic最特別的特性是,可以對(duì)dynamic變量調(diào)用任何屬性或以任意參數(shù)調(diào)用任何函數(shù):
val dyn: dynamic = ...
dyn.whatever(1, "foo", dyn) // 'whatever'沒有定義
dyn.whatever(*arrayOf(1, 2, 3))
在JavaScript平臺(tái)上,該kotlin代碼按原樣編譯: 在生成的JavaScript代碼中,Kotlin的dyn.whatever(1)變?yōu)閐yn.whatever(1)
當(dāng)在dynamic類型的值上調(diào)用,可能需要使用@JsName注解為要調(diào)用的函數(shù)分配名稱!
函數(shù)動(dòng)態(tài)調(diào)用總是返回dynamic,所以可以自由地鏈?zhǔn)秸{(diào)用:
dyn.foo().bar.baz()
把lambda表達(dá)式傳給一個(gè)動(dòng)態(tài)調(diào)用時(shí),它的所有參數(shù)默認(rèn)都是dynamic類型:
dyn.foo {
x -> x.bar() // x 是 dynamic
}
使用dynamic類型值的表達(dá)式會(huì)按原樣轉(zhuǎn)換為JavaScript,并且不使用Kotlin約定的運(yùn)算符,支持以下運(yùn)算符:
二元(binary): +, -, *, /, %, >, < >=, <=, ==, !=, ===, !==, &&, ||
一元(unary)
前置(prefix): -, +, !
前置及后置(postfix): ++, --
賦值(assignments): +=, -=, *=, /=, %=
索引訪問(wèn)(indexed access):
讀(read): d[a], []多于一個(gè)參數(shù)會(huì)出錯(cuò)
寫(write): d[a1] = a2, []多于一個(gè)參數(shù)會(huì)出錯(cuò)
注意: in, !in以及..操作符,對(duì)于dynamic類型是被禁用(在JavaScript平臺(tái)被禁用)!
簡(jiǎn)書:http://www.reibang.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