ジェネリックの定義: ジェネリックはJDK 1.5の新機能であり、その本質はパラメータ化された型(Parameterized Type)の適用であり、操作されるデータ型が次のように指定されることを意味します。パラメータ 、使用時に特定のタイプを指定します。このパラメータ タイプは、それぞれジェネリック クラス、ジェネリック インターフェイス、ジェネリック メソッドと呼ばれるクラス、インターフェイス、およびメソッドの作成に使用できます。
ジェネリックの考え方は、早くも C++ 言語のテンプレートに根付き始めました。Java 言語がジェネリックがまだ登場していないバージョンだったとき、メソッドは Object の親クラスだけでした。すべての型と型キャスト機能を組み合わせて型の一般化を実現します。たとえば、ハッシュ テーブルのアクセスでは、JDK 1.5 より前では HashMap の get() メソッドが使用されていました。Java 言語のすべての型は java.lang.Object を継承しているため、Object は次のようになります。成都はあらゆるオブジェクトに変換できます。ただし、可能性は無限にあるため、このオブジェクトがどのタイプのオブジェクトであるかを知るのはプログラマとランタイム仮想マシンだけです。コンパイル中に、コンパイラは、このオブジェクトの強制変換が成功したかどうかを確認できません。この操作の正確性をプログラマのみに依存している場合、ClassCastException の多くのリスクがプログラム ランタイムに伝達されます。 C# と Java でのジェネリック テクノロジの使用は同じように見えますが、プログラム ソース コード、中間言語、中間言語、中間言語の実装において根本的な違いがあります。 、言語、現時点では、ジェネリックはプレースホルダーです)、または、List
Java 言語のジェネリックは異なり、コンパイルされたバイトコード ファイル内にのみ存在し、元の raw タイプ (Raw Type、ネイキッド タイプとも呼ばれます) に置き換えられ、キャスト コードが挿入されます。したがって、実行時の Java 言語では、ArrayList
汎用メカニズムを使用して書かれたプログラムコードは、オブジェクト変数を乱雑に使用して強制的に型変換を実行するコードよりも安全で読みやすいです。ジェネリックはコレクション クラスで特に便利です。
ここでコードの一部を見てみましょう。
List list = new ArrayList(); list.add("CSDN_SEU_Cavin"); list.add(100); for (int i = 0; i < list.size(); i++) { String name = (String) list.get(i); //取出Integer时,运行时出现异常 System.out.println("name:" + name); }
2. ジェネリックの使用 ジェネリックを使用すると、プログラマーは通常コレクションで使用される型の抽象化を使用できます。
List<String> list = new ArrayList<String>();
3. ジェネリックはコンパイル中にのみ有効です ジェネリックを使用するときは、ジェネリックがコンパイルされるときに何が起こるかを理解する必要もあります。そのため、ここでは次の点に特別な注意を払う必要があります。コードがクラスファイルにコンパイルされたときに有効です
AyyayList<String> a = new ArrayList<String>(); ArrayList b = new ArrayList(); Class c1 = a.getClass(); Class c2 = b.getClass(); System.out.println(a == b);
つまり、Javaのジェネリックスはコンパイル段階でのみ有効です。コンパイル プロセス中に、ジェネリックの結果が正しく検証された後、ジェネリックの関連情報が消去され、型チェックと型変換メソッドがオブジェクトのエントリ メソッドと終了メソッドの境界に追加されます。言い換えれば、
正常にコンパイルされたクラスファイルには一般的な情報は含まれていません。一般的な情報は実行時フェーズに入りません。 次のコードは、ジェネリックがコンパイル中にのみ有効であることを Java のリフレクション メカニズムを通じてよく説明しています
ArrayList<String> a = new ArrayList<String>(); a.add("CSDN_SEU_Cavin"); Class c = a.getClass(); try{ Method method = c.getMethod("add",Object.class); method.invoke(a,100); System.out.println(a); //[CSDN_SEU_Cavin, }catch(Exception e){ e.printStackTrace();
ジェネリック クラスとジェネリック メソッド
public static class FX<T> { private T ob; // 定义泛型成员变量 public FX(T ob) { this.ob = ob; } public T getOb() { return ob; } public void showTyep() { System.out.println("T的实际类型是: " + ob.getClass().getName()); } } public static void main(String[] args) { FX<Integer> intOb = new FX<Integer>(100); intOb.showTyep(); System.out.println("value= " + intOb.getOb()); //java.lang.Integer System.out.println("----------------------------------"); FX<String> strOb = new FX<String>("CSDN_SEU_Calvin"); strOb.showTyep(); System.out.println("value= " + strOb.getOb()); //value= 100 }
5.ジェネリックの利点
(1) 型安全性。
ジェネリックを使って定義された変数の型制限を知ることで、コンパイラはJavaプログラムの型安全性をより効果的に向上させることができます。
(2)強制的な型変換を排除する。
ソースコード内の多くのキャストを削除します。これにより、コードが読みやすくなり、エラーの可能性が減ります。すべてのキャストは自動的かつ暗黙的に行われます。
(3)パフォーマンスの向上
以上がJava のジェネリックスを詳しく見るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。