Dart には 2 種類のタイプが存在します。
- ランタイム タイプ
- スタティックタイプ
Dart 言語仕様の証明は次のとおりです。
nullの静的型は下です。
- のランタイム タイプ
null
はNull
- の静的タイプ
null
はbottom
これは、Dart のオブジェクトが 2 種類のタイプを持つことができることを意味します。
を呼び出した 1 つの実数型と を呼び出したstatic
1 つのvirtual
型runtime
。
つまり、 の実行時型はnull
abottom
ではなく、通常の classNull
です。
class Null {
factory Null._uninstantiable() {
throw new UnsupportedError('class Null cannot be instantiated');
}
/** Returns the string `"null"`. */
String toString() => "null";
}
しかし同時に、この通常の実行時型の値はNull
、他の型に割り当てることができます。これは、の実際の (静的) 型が型であるためnull
ですbottom
。
Dartでこのテクニックをどのように呼びましたか?
型置換か何か違う?
PS
値の静的型に関するこの質問ですが、型注釈で宣言された変数の静的型に関するものではありません。
これは、null
が変数ではなく、value
ofstatic type
を使用しているためですbottom
。
PS
非常に興味深いケースです(少なくとも私にとっては)。
void main() {
Null _null;
String s = _null;
}
警告が表示されます:
A value of type 'Null' cannot be assigned to a variable of type 'String'
それはかなり正しいです。しかし同時にこれは機能します。
型置換 (静的および実行時) に関する興味深いこと。