动态类型-类型绑定
静态类型:类型的变量有明确的行为约束;
动态类型:为所欲为;
动态类型:动态类型绑定类型;动态:可变、晚绑定;
静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型。
https://www.cnblogs.com/Roylh/p/8135843.html
Being a statically typed language, Kotlin still has to interoperate with untyped or loosely typed environments, such as the JavaScript ecosystem. To facilitate these use cases, the dynamic type is available in the language:
x
val dyn: dynamic = ...
The dynamic type basically turns off Kotlin's type checker:
- a value of this type can be assigned to any variable or passed anywhere as a parameter;
- any value can be assigned to a variable of type dynamic or passed to a function that takes dynamic as a parameter;
- null-checks are disabled for such values.
The most peculiar feature of dynamic is that we are allowed to call any property or function with any parameters on a dynamic variable:
dyn.whatever(1, "foo", dyn) // 'whatever' is not defined anywhere
dyn.whatever(*arrayOf(1, 2, 3))
On the JavaScript platform this code will be compiled "as is": dyn.whatever(1) in Kotlin becomes dyn.whatever(1) in the generated JavaScript code.
https://kotlinlang.org/docs/reference/dynamic-type.html
作为一种静态类型的语言,Kotlin仍然需要与无类型或松散类型的环境(例如 JavaScript生态系统)进行互操作。为了方便这些使用场景,语言中有 dynamic 类型可用:
x
val dyn: dynamic = ……
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
}
https://www.kotlincn.net/docs/reference/dynamic-type.html
底层支持是
1、运行时类型信息;;
2、运行时消息转发机制;
动态类型可以为所欲为:
它的消息和数据的搜索空间是整个已经存在的类型空间;
在oc语言中:
类型空间有相应的方法,则不报错;
否则报错;
- (void)test:(id)gots{
[gots goog];
[gots class];
[gots ends];
}