動的型
NOTE
JVMをターゲットとするコードでは、動的型はサポートされていません。
静的型付け言語であるKotlinは、JavaScriptエコシステムのような、型なしまたはゆるい型付けの環境と相互運用する必要があります。これらのユースケースを容易にするため、dynamic
型が言語で利用可能です。
val dyn: dynamic = ...
dynamic
型は基本的にKotlinの型チェッカーを無効にします。
dynamic
型の値は、任意の変数に割り当てたり、どこへでも引数として渡したりできます。- 任意の値を
dynamic
型の変数に割り当てたり、dynamic
を引数に取る関数に渡したりできます。 dynamic
型の値に対するnull
チェックは無効になります。
dynamic
の最も特徴的な機能は、任意のプロパティや関数を任意の引数でdynamic
変数に対して呼び出すことができる点です。
dyn.whatever(1, "foo", dyn) // 'whatever'はどこにも定義されていません
dyn.whatever(*arrayOf(1, 2, 3))
JavaScriptプラットフォームでは、このコードは「そのまま」コンパイルされます。Kotlinのdyn.whatever(1)
は、生成されたJavaScriptコードではdyn.whatever(1)
になります。
dynamic
型の値に対してKotlinで書かれた関数を呼び出す際は、KotlinからJavaScriptへのコンパイラによって実行される名前マングリングに留意してください。呼び出す必要のある関数に明確な名前を割り当てるには、@JsNameアノテーションを使用する必要があるかもしれません。
動的な呼び出しは常にdynamic
を結果として返します。そのため、そのような呼び出しを自由に連鎖させることができます。
dyn.foo().bar.baz()
動的な呼び出しにラムダを渡すと、そのすべてのパラメータはデフォルトでdynamic
型になります。
dyn.foo {
x -> x.bar() // xはdynamicです
}
dynamic
型の値を使用する式は、JavaScriptに「そのまま」変換され、Kotlinの演算子規則は使用しません。 次の演算子がサポートされています。
- 二項:
+
,-
,*
,/
,%
,>
,<
,>=
,<=
,==
,!=
,===
,!==
,&&
,||
- 単項
- 前置:
-
,+
,!
- 前置および後置:
++
,--
- 前置:
- 代入:
+=
,-=
,*=
,/=
,%=
- インデックス付きアクセス:
- 読み込み:
d[a]
, 複数の引数はエラーになります - 書き込み:
d[a1] = a2
,[]
内の複数の引数はエラーになります
- 読み込み:
dynamic
型の値に対するin
、!in
、および..
演算は禁止されています。
より技術的な説明については、仕様ドキュメントを参照してください。