序文
ジェネリック(ジェネリック)、一般化は、タイプ、文字通りの意味から、すなわち、パラメータ化された型が理解されます。
プログラムをより強固な作り、実行するために、コンパイラから事前に質問の多くを置く能力:我々は、すべてのジェネリックはJDK5が、それは優れた品質をたくさん持って提供する非常に重要な新機能であることを知っています。
Java5が良いの下位互換性を維持するために、今までの打ち上げの際には、それが虚偽のものであるので、しかし:コンパイル時にのみ存在し、存在しないの.classファイルにコンパイル、これは一般的な、いわゆるです消去。
二つのクラスの以下の比較は、クラスは、一般的であり、一般的なクラスです。
クラスジェネリック{ オブジェクトK。 オブジェクトV; 公共ジェネリック(オブジェクトK、オブジェクトV){ この .K = K。 この .V = V; } } クラスジェネリック<K、V> { KのK。 VのV; 公共ジェネリック(K kを、V V){ この .K = K。 この .V = V; } }
クラスの名前を一般的なジェネリッククラスを宣言した後、角括弧型パラメータリストにより形成された一般的な複数のパラメータがあってもよいです。
ジェネリックインターフェイス
パブリック インターフェースジェネレータ<T> { パブリックTの次の()。 }
この汎用的なインタフェースの設計は、工場出荷時のデザインパターンは、インターフェースを生成するために使用されて宣言されています。私たちの共通のIteratorインターフェイスは、次のようなIterable
、そのようなインタフェースであり、
パブリック インターフェースのIterable <T> { イテレータ <T> イテレータ(); }
一般的な方法
例としては、静的ジェネリックメソッドとジェネリックメソッドに分け。
パブリック <T> T genericMethod(T T){ 戻りTを; } // なお、静的メソッド<T>静的後ろでなければならない〜 パブリック 静的 <T> T genericStaticMethod(T T){ 戻りTを; }
それは少しのノートのようになります。
パブリック クラスメイン<T> { // 静的メソッドは、直接Tが宣言を所有する必要があり、一般的なクラス・パラメータを使用することはできません // 正しい方法書くように形を:パブリックstatic <T> T genericStaticMethod (TのT){...} パブリック 静的T genericStaticMethod(T T){ 戻りTを; } // 例示的な方法は、ジェネリックパラメータクラス宣言として使用することができる 公共T genericMethod(T T){ 戻り、Tを } }
一般的なパラメータを使用してstaticメソッドは、独自の独立した声明、それ以外の場合はコンパイルエラーが必要。
ジェネリッククラス宣言ステートメントとパラメータリストの種類に記載されている一般的な方法であり、わずかに異なるが、戻り値の型の前に角括弧付き(ジェネリック型の複数であってもよい)、及び関数渡されたパラメータの型を利用することができますジェネリックが表現されています。
ジェネリック消去
パブリック クラスメイン{ 公共 静的 ボイドメイン(文字列[]引数){ リストの<string> C1 = 新規のArrayList <> (); 一覧 <整数> C2 = 新しい ArrayListを<> (); クラス <?延び一覧>クラス1 = c1.getClass()。 クラス <?延び一覧>クラス2 = c2.getClass()。 System.out.println(クラス1 == クラス2)。 } }
出力は次のとおりです。本当の
事実は、多くの小さなパートナーは明らかに、それは同じではありません合格するための一般的なタイプを理解することはできませんがあるかもしれない、なぜそれはまだ同じクラスでしょうか???消去ジェネリック-ここでは、ジェネリックに固有のJava言語を言わなければなりません。
この例では示しています。我々は実行時に、リスト<文字列>とList <Integer型>を宣言すると、彼らはリスト、および整数と文字列パラメータ情報が消去され、特定の種類をしている、実際には同じです。
一般的なワイルドカード
<? super T>
和<? extends T>
和<?>