动态类型
Kotlin 是一种静态类型的语言, 但它必须与无类型的或类型系统较为松散的语言交互, 比如 JavaScript 的环境. 为了方便这样的使用场景, Kotlin 语言 提供了 dynamic 类型:
简单来说, dynamic 类型关闭了 Kotlin 的类型检查:
一个
dynamic类型的值可以赋值给任何变量, 也可以作为参数传递给任何函数.任何值都可以赋值给一个
dynamic类型的变量, 或传递给函数的dynamic类型参数.对
dynamic类型的值不做null检查.
dynamic 最受欢迎的功能是, 对 dynamic 类型变量, 可以访问它的 任何 属性, 还可以使用任意参数访问它的任何函数:
在 JavaScript 平台, 这些代码会被"原封不动"地编译: Kotlin 代码中的 dyn.whatever(1), 编译产生的 JavaScript 代码就是同样的 dyn.whatever(1).
对 dynamic 类型的值调用 Kotlin 编写的函数时, 要注意, Kotlin 到 JavaScript 编译器会进行名称混淆. 你可能需要使用 @JsName 注解 来为你需要调用的函数指定一个明确的名称.
一个动态调用永远会返回一个 dynamic 的结果, 因此你可以将这些调用自由地串联起来:
当你向一个动态调用传递一个 Lambda 表达式作为参数时, Lambda 表达式的所有参数类型默认都是 dynamic:
使用 dynamic 类型值的表达式, 会被"原封不动"地翻译为 JavaScript, 请注意不要使用 Kotlin 的运算符规约. 以下运算符是支持的:
二元运算符:
+,-,*,/,%,>,<>=,<=,==,!=,===,!==,&&,||一元运算符
前缀运算符:
-,+,!可以用作前缀运算符, 也可以用作后缀运算符:
++,--
计算并赋值运算符:
+=,-=,*=,/=,%=下标访问运算符:
读操作:
d[a], 参数多于一个会报错写操作:
d[a1] = a2,[]内的参数多于一个会报错
对 dynamic 类型的值使用 in, !in 和 .. 操作是禁止的.
关于更加深入的技术性介绍, 请参见 规格文档.