Javaジェネリックがいくつかの重要な方法で失敗したことは一般に受け入れられています。ワイルドカードと境界の組み合わせにより、いくつかの深刻な読み取り不能コードが発生しました。
しかし、他の言語を見ると、プログラマが満足している一般的な型システムを見つけることができないようです。
このような型システムの設計目標として次を採用する場合:
- 常に読みやすい型宣言を生成します
- 簡単に習得できます(共分散、反分散などをブラッシュアップする必要はありません)
- コンパイル時エラーの数を最大化します
それを正しくした言語はありますか?私がグーグルで見た場合、私が見る唯一のことは、型システムが言語Xをどのように吸うかについての苦情です。この種の複雑さはジェネリック型に固有のものですか?コンパイル時に型安全性を100%検証しようとするのをあきらめるだけですか?
私の主な質問は、これらの3つの目標に関して最も「うまくいく」言語です。私はそれが主観的であることを認識していますが、これまでのところ、すべてのプログラマーが汎用型システムが混乱していることに同意するわけではない言語を見つけることさえできません。
補遺:前述のように、サブタイピング/継承とジェネリックの組み合わせが複雑さを引き起こすので、両方を組み合わせ、複雑さの爆発を回避する言語を本当に探しています。
Foo<T> where SiameseCat:T
)を適用する方法がないことと、に変換できないジェネリック型を持つ可能性がないことだと思いObject
ます。私見、.NETは、構造体に似ているがさらに骨が粗い集約型の恩恵を受けるでしょう。そのKeyValuePair<TKey,TValue>
ような型であれば、IEnumerable<KeyValuePair<SiameseCat,FordFocus>>
をにキャストできますIEnumerable<KeyValuePair<Animal,Vehicle>>
が、型をボックス化できない場合のみです。
easy-to-read type declarations
ですか?3番目の基準も曖昧です。たとえば、コンパイル時にインデックスを計算できない限り、配列にインデックスを付けないようにすることで、配列インデックスを境界外例外からコンパイル時エラーに変えることができます。また、2番目の基準はサブタイピングを除外します。それは必ずしも悪いことではありませんが、あなたが何を求めているのかを知っておく必要があります。