3

Dart には 2 種類のタイプが存在します。

  1. ランタイム タイプ
  2. スタティックタイプ

Dart 言語仕様の証明は次のとおりです。

nullの静的型は下です。

  1. のランタイム タイプnullNull
  2. の静的タイプnullbottom

これは、Dart のオブジェクトが 2 種類のタイプを持つことができることを意味します。

を呼び出した 1 つの実数型と を呼び出したstatic1 つのvirtualruntime

つまり、 の実行時型はnullabottomではなく、通常の 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が変数ではなく、valueofstatic typeを使用しているためですbottom

PS

非常に興味深いケースです(少なくとも私にとっては)。

void main() {
  Null _null;
  String s = _null;
}

警告が表示されます:

A value of type 'Null' cannot be assigned to a variable of type 'String'

それはかなり正しいです。しかし同時にこれは機能します。

型置換 (静的および実行時) に関する興味深いこと。

4

2 に答える 2

5

Dartの実行時の型はそのクラスです。Dartの静的型は、静的型推論によって導出されるものであり、静的型の世界に属します。その世界は、プログラムで宣言されたクラスだけではありません。型「bottom」、型「dynamic」、および関数型「int->int」はすべて、クラスに対応しない静的型の例です。

言い換えれば、値にはクラスがあり、式には型があります (他の多くの言語と同様)。静的型はコンパイル時に存在し、値は実行時にのみ存在するため、「値の静的型」はありません [1]。

静的型推論アルゴリズムは、Dart 言語仕様で指定されています。それが何であるかであり、必要なのは、プログラムの実行時の動作と何らかの形で互換性があることだけです。

静的型システムは、可能性のあるプログラミング エラーを検出しようとするプログラム分析であり、それ以上でもそれ以下でもありません。静的タイプの警告が表示された場合、確実ではありませんが、バグがある可能性が高いと考えられます。型推論システムは、誤った警告をほとんど出さず、実際のバグをほとんど検出しない必要があります。また、記述、理解、および実装が十分に単純である必要があります。

「null」の型として「bottom」を選択することは、静的型システムを型間の「割り当て可能な」関係に一致させる方法にすぎません。これは、割り当てが実行時にチェックするものであり、どこでも「Null」を明示的にチェックする必要はありません。たまたま有用な結果が得られるアルゴリズムにすぎません。

静的型は実行時に存在しません。たとえば、VM には静的型システムの実装がまったく含まれていません。

/L

[1] まあ、コンパイル時の定数式を除いて。

于 2014-02-19T10:07:29.840 に答える