質問

村のバカになる危険性があるのに、ジェネリックがジェネリックと呼ばれる理由を誰かに説明できますか?それらの使用法と利点を理解していますが、ジェネリックの定義が<!> quot; general < !> quot;ジェネリックコレクションはタイプセーフですが、なぜこれが誤った名前ではないのですか?

たとえば、ArrayListはオブジェクトであるものをすべて保持できます。

ArrayList myObjects = new ArrayList();
myObjects.Add("one");
myObjects.Add(1);

文字列型のジェネリックコレクションは文字列のみを保持できます:

var myStrings = new List<string>();
myStrings.Add("one");
myStrings.Add("1");

なぜ<!> quot; generic <!> quot;と呼ばれるのか明確ではありません。答えが<!> quot; ...の場合、クラスまたはメソッドがクライアントコードによって宣言およびインスタンス化されるまで、1つまたは複数の型の仕様を延期するクラスおよびメソッドを設計できます。<!> quot; こちらから、それは理にかなっていると思います。おそらくJavaがジェネリックを導入してからプログラミングを始めたので、この精神的な衰弱を経験しているのかもしれません。それでも...

ご協力いただければ幸いです。

役に立ちましたか?

解決

<!> quot;汎用<!> quot;実装について話している。単一の<!> quot; Generic <!> quot;を記述します。使用するタイプごとに特定の実装を作成する代わりに、任意のタイプで機能する実装をリストします。

他のヒント

このような質問に対する正しい答えは、ほとんど常に<!> quot;歴史的理由、ほとんどは<!> quot;だと思います。ジェネリックは<!> quot; schemes <!> quot;と呼ばれることもあります。または<!> quot; classes <!> quot;または<!> quot; type family <!> quot;または<!> quot; genera <!> quot;または<!> quot; type functions <!> quot;または<!> quot; statics <!> quot;または<!> quot; Greek types <!> quot;または他の百万のいずれか。昔、誰かが<!> quot; generic <!> quot;という単語を使用することを決めました。

<!> quot;汎用<!> quot; Javaの意味では、少なくとも1970年代半ばまでさかのぼります。米国国防総省は、新しいプログラミング言語(ADAとなる)の要件文書を整備していました。初期のドラフト( <!> quot; Woodenman <!> quot; 、1975年8月)と言う:

  

各要素タイプの定義を繰り返すことなく、スタックやキューなどの一般的な手順やデータ構造を指定できるようにするために、拡張可能言語ではコンパイル時間パラメーターが必要です。

これは、<!> quot; generic <!> quotの唯一の使用法です。ドキュメント内。どのように意図されたのかは明確ではありません。しかし、1977年7月( <!> quot; Tinman <!> quot; )ジェネリックに関する段落全体があり、その用語は明らかに特定の何かを意味するようになりました:

  

12D。一般的な定義

     

各呼び出しでの変換中にインスタンス化されるパラメータを使用して、関数、プロシージャ、およびタイプを定義することができます。このようなパラメーターは、定義済みの識別子(変数、関数、または型の識別子を含む)、式、またはステートメントです。これらのパラメーターは、他のすべてのパラメーターと同様に、呼び出しのコンテキストで評価されます。

1978年6月( <!> quot; Steelman <!> quot; )専門用語が確立されました。 <!> quot; generic <!> quotという用語は他にも使用されていました。ドキュメントの他のセクションでは、この機能を明確に参照しています。完成した言語では、genericは予約語でした。

これらの文書の著者はサイトにリストされており、おそらくほとんどがまだ存在しています。それらを呼び出して、彼らが覚えていることを尋ねるのはいいでしょう。


<!> quot; generic <!> quot;のもっともらしいと思われる使用。学界で見つけたのは、ロビン・ミルナーの <!> quot;理論<!> quot; (1978)(および彼は<!> quot; generic <!> quot;で彼の意味を説明せざるを得ないので、一般的には使用できなかった当時の学界で):

  

つまり、これは map のジェネリック型です。つまり、この宣言のスコープ内で map が出現する場合、この型の置換インスタンスを割り当てる必要があります。

<!> quot;ジェネリック型変数<!> quot; CSの専門用語になりました。

bool Equals(int x, int y)

上記の方法は整数のみを比較できるため、整数を比較するための特殊化と言えます。

bool Equals<T>(T x, T y);

上記の方法は任意の型の値を比較できるため、特定の型に対しては特殊化ではなく、 generic であると言えます。

私は言語のセマンティクス(javaではなく英語)には入りたくありません。トートロジーで答えるリスクもあります。ジェネリックメソッドはジェネリックと呼ばれます。なぜなら、あなたが言ったように、一般的な意味で使用でき、特定の型がなく、一般的に使用できるからです

さて、私は 完全に 推測しているので、これを一粒の塩で取りますが、それは<!> quot; Generativeのろくでなしかもしれませんタイプ<!> quot;。

概念的に、リストをリストに特化する場合<!> lt;文字列<!> gt ;、新しいタイプを生成します。少なくとも、それがC ++テンプレートとC#ジェネリックでの動作です。

Javaでは、パラメータ化は型消去を使用してコンパイラによって破棄されるため、実際には 新しい特殊な型を生成します。 >

Javaが生成型の汎用バージョンを実装していると言うことができると思います:)


編集中:

別の視点があります...

タイプList <!> lt;文字列<!> gt; <!> quot; generic <!> quot;を参照するときに、彼らが話していることではありません。タイプ。用語は実際にはリストを参照していると思います<!> lt; T <!> gt;タイプ。これは、タイプがその汎用形式で存在する方法です。リスト<!> lt;文字列<!> gt;汎用List <!> ltの特殊化です。 T <!> gt;。

彼らがそれを呼んだ場合<!> quot; type parameter(s)<!> quot;タイプTypeのパラメーターと混同するでしょう。

また、ArrayListは<!> quot; generic <!> quot;ではありません。オブジェクトのタイプでのみ動作します。何かを要求すると、オブジェクト参照が提供されます。これは非常に具体的な動作です。

オブジェクトを受け取るクラスはジェネリックではなく、非常に具体的にはそれ自体がジェネリック型である type を取ります。一方、ジェネリッククラスは、特定のタイプで使用できます。

<!> quot; Generic <!> quot;を作成しているため。同じ方法で(指定した制約内で)任意のタイプで操作できるコード...

お馴染みの良い例は、Add演算子はほぼすべての言語です... <!> quot; Add <!> quot;整数、浮動小数点、倍精度、10進数、2進数、16進数、符号付き、符号なし、ビット数などに関係なく...

私は<!> quot; native <!> quotではありません;英語の話者なので、間違っているかもしれませんが、<!> quot; Generics <!> quot;ジェネリックの定義型ですよね?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top