どの静的型付け言語がジェネリックをサポートしていないか (そして、歴史的にどの言語がジェネリックを持っていなかったのか)、そしてそれらがどのように対処しているかに興味があります。
ユーザーはあちこちにキャストしますか? リストや辞書などの基本的なコレクションをジェネリックにできる特別なソースはありますか?
これらの言語にジェネリックがないのはなぜですか? 潜在的な複雑性やその他の理由を避けるためですか?
どの静的型付け言語がジェネリックをサポートしていないか (そして、歴史的にどの言語がジェネリックを持っていなかったのか)、そしてそれらがどのように対処しているかに興味があります。
ユーザーはあちこちにキャストしますか? リストや辞書などの基本的なコレクションをジェネリックにできる特別なソースはありますか?
これらの言語にジェネリックがないのはなぜですか? 潜在的な複雑性やその他の理由を避けるためですか?
C (および C++ と呼ばれる前の歴史的な C++) では、「ジェネリック」型を手動で非ジェネリック (つまり、C++ テンプレートに相当する C プリプロセッサ マクロ) に展開するか、型システム (つまり、void ポインター) をエスケープする必要があります。
ただし、配列 (リスト) は、単一の型ではなく、複合型として扱われます。たとえば、short の配列を持つことはできますが、char の配列や long の配列と同じように扱うことはできません。
これは C ではそれほど大きな問題ではありませんが、不便な場合もあります。文脈上、40 年前からのトレードオフを表しています。
Java 1.4 または 1.3 をダウンロードして、自分で試してみてください。
ヒント:はい、おそらく多くのキャストがいるでしょう
対処方法:ユーザーの混乱を避けるために、(メソッド宣言で) コレクションではなく配列を使用することを API に強制している組織を見てきました。別の方法は、特定のクラスでのみ機能する特定のコレクション クラスを作成することですStringList
。
C# は、v2.0 までジェネリックをサポートしていませんでした。そうです、それでは から多くのキャストが必要でしたObject
。
VB.Net でも同じことが言えると思います。
Pascal は、元の形式ではジェネリックをサポートしていませんでした。リンクされたリストが必要な場合は、特定のタイプ (IntLinkedList など) 用に作成する必要がありました。
Pascal の最近のバージョン (ObjectPascal/Delphi など) は、何らかの形式のジェネリックを提供している場合があります。
これに対する簡単な答えは、C++ テンプレートです。既存の型を制限するジェネリックとは異なり、テンプレートはコンパイル時に新しい型を生成する方法です。ほとんどのコード生成ソリューションと同様に、これはあまり満足のいくものではありません。したがって、先に進みました。