7

http://www.dartlang.org/docs/spec/dartLangSpec.pdf

ダーツの言語仕様は以下に言及しています

Dartは、インターフェイスタイプに基づくオプションのタイピングをサポートしています。ジェネリック型の共分散のため、型システムは不健全です。これは意図的な選択です(そして間違いなく物議を醸しています)。経験によれば 、ジェネリックスのサウンドタイプルールはプログラマーの直感に直面しています。です。

  • 型システムが不健全である理由について誰かがさらに詳しく説明できますか?
  • ジェネリックスのサウンドタイプルールが直感に直面して飛ぶと言ったとき、ダートラングスペックライターは何を考えていましたか?
4

3 に答える 3

9

ギラッド・ブラチャ[1]から:

あなたはこれらのことについて血まみれの殺人を叫ぶツールを書くことができます、しかしあなたがすることができないことは人々が彼らのプログラムを実行するのを止めることです。

または、言い換えると[2]:

問題は、ほとんどのプログラマーにとって、型フローを完全かつ明示的に表現することは、値を渡し、実行時の型エラーが発生した場合にそれを処理するコードを記述するよりも難しいことです。この難易度の違いのために選ばれた言葉は、後者が前者よりも「直感的」であるということです-私はそれが言葉の特に悪い選択ではないと思います。この現象は、動的言語が近年非常に人気が高まっている最大の理由の1つであり、静的型を指定する際の複雑さを排除しています。

これは、別の三角形のトレードオフがあるようなものです。表現力、サウンド、シンプルさです。型システムに2つ選択してください。ほとんどの人は表現力を放棄することを望んでいません-現代のソフトウェアで織り込まれたオブジェクトグラフは確かにかなり絡み合っている可能性があります-一方、大規模な成功を望む言語は、かなり単純なものから始めることはできません。そのため、(静的に型付けされた)健全性の測定をあきらめ、デバッグおよびテスト中に多くの実行時型エラーを予期します。

[1] http://blog.sethladd.com/2011/11/transcription-of-quick-tour-of-dart-by.html

[2] http://lambda-the-ultimate.org/node/4377#comment-67589

于 2011-11-17T15:53:14.027 に答える
8

ジェネリックスのサウンドタイプルールが直感に直面して飛ぶと言ったとき、ダートラングスペックライターは何を考えていましたか?

この質問の右側にある関連する質問を見てください。そうか:

  • なぜList<Number>サブタイプではないのList<Object>ですか?
  • ジェネリックインターフェースがデフォルトで共変性/反変ではないのはなぜですか?
  • にを割り当てられないのはなぜList<Derived>ですかList<Base>
  • なぜからにキャストできないのlist<MyClass>ですList<object>か?
  • なぜAnimals[] animals = new Cat[5]コンパイルするのにコンパイルList<Animal> animals = new List<Cat>()しないのですか?

共分散は(多くの可変型にとって)健全ではありませんが、多くのプログラマーが最初にジェネリック型で作業を開始したときに直感的に期待する動作です。

于 2011-12-15T08:34:33.827 に答える
2

より具体的には、不健全性に関する限り、ジェネリック型は共変です。したがって、文字列のリストは、オブジェクトのリストを期待するものに渡すことができます。これはタイプセーフではありません。オブジェクトのリストを期待するものが、文字列ではないものをリストに追加しようとする可能性があるためです。しかし、AのサブクラスとしてBがあるが、Collection<B>がCollection<A>のサブタイプではない場合、直感的ではないことを人々に伝えます。

于 2011-11-18T14:10:59.627 に答える