1。ジェネリックの基本概念
C#と同様に、Javaには、型のジェネリックとパラメーター化の概念があります。 JavaのジェネリックはJDK5.0の後に登場しますが、JavaのジェネリックはC#のジェネリックとは本質的に異なります。まず、コレクションタイプの観点から、JavaのArrayList <Integer>とArrayList <String>は同じタイプです。編集中にタイプ消去が実行され、Javaのタイプは仮性物質です。疑似遺伝子は後で導入されます。第二に、INTなどの基本タイプのデータをコレクションに追加すると、INTは最初に整数オブジェクトに変換されます。これは通常、ボクシング操作と呼ばれます。要素を取り出す場合、IntergerオブジェクトはINT値タイプ、つまりボクシング操作を解除する必要があります。 C#では、リスト<int>およびList <String>は異なるタイプです。一般的なパラメーターは、コンピレーション後のプレースホルダーになり、消去されません。実行時に実際のタイプが割り当てられます。システムランタイム中に生成され、独自の仮想メソッドテーブルとタイプデータがあります。この実装はタイプインフレと呼ばれます(タイプインフレについては、インスタントコンパイラはこの問題を解決するために多くの最適化作業を行っています)。これはいわゆる真のジェネリックです。同時に、INTなどの基本的な要素をコレクションに追加する場合、ボックスする必要はなく、要素を取り出すときにボックス化を必要としません。したがって、パフォーマンスはJavaコレクションジェネリックよりも優れています。
Javaでのジェネリックの導入は、主に2つの問題を解決することです。1。タイプの交換の例外は、コレクションタイプ要素の実行時に発生し、コンパイルタイムタイプ中にタイプチェックが追加されます。 2.ソリューション中にコードを繰り返すと、アルゴリズムを再利用できます。以下は、コンパイラのタイプチェックを説明する例です。
まず、ジェネリックが使用されない例を見てみましょう。
arrayList al = new ArrayList(); Al.Add( "ABC"); Al.Add( "124"); Al.Add( "32L");
あらゆるタイプのデータをALコレクションに追加できます。次のようなデータを取得するときにタイプを変換する必要がある場合:
string s =(string)al.get(0); string s1 =(string)al.get(1); //実行期間では、エラーが報告され、タイプ変換エラーは長いl =(long)al.get(2)になります。
これから、ジェネリックがない場合、編集中にタイプチェックが削減されることがわかります。要素を取り出す場合、プログラマーは各要素のタイプを知る必要があります。そうしないと、実行時に型変換の例外が発生する場合があります。
それでは、一般的なコレクションを通してそれがもたらす利点を見てみましょう。
ArrayList <String> al1 = new ArrayList <String>(); al1.add( "abc"); al1.add(1); //コンピレーション中にエラーが発生しました、
文字列パラメータータイプでAL1をインスタンス化すると、INT要素を追加できません。そうしないと、コンパイラがエラーを報告します。通常、EclipseなどのIDEエディターにエラーマークがあります。同時に、要素を抽出するときに変換を入力する必要はありません。
文字列値= al1.get(0); //タイプ変換は必要ありません
これがジェネリックの利点です。
次に、アルゴリズムの多重化は、主に、任意のタイプまたは限られたタイプで使用できるADD ArrayListメソッドなどのメソッドの多重化に反映されます。
2。ジェネリックの使用
Javaのジェネリックは、主にクラス、方法、およびインターフェイスで使用されています。まず、クラスの使用を簡単に見てみましょう。
クラスファクトリー<t> {private t value; public t getValue(){return値; } public void setValue(t v){this.value = v; }}テスト方法を追加:
Factory <String> f = new Factory <String>(); f.setValue( "使用中の工場"); System.out.println(f.getValue());
一般的なインターフェイスの使用:
インターフェイスmyinterface <t、u> {void show(t、u u); } class showtest実装myinterface <string、integer> {@override public void show(string t、integer u){system.out.println(t); System.out.println(u); }}一般的な型パラメーターがクラスに作用する場合、主に複数のフィールドとメソッドシグネチャ間のタイプの制約を制限します。メソッドに作用する場合、メソッドの複数のパラメーターに主な制約が作成されます。ここでは、メソッドの汎用型パラメーターに例が与えられなくなります。主に、以下のタイプパラメーターの制約を紹介します。
3。パラメーターの制約を入力します
次のコードに示すように、小さな例を見てみましょう。
public static <t> t get(t t1、t t2){if(t1.compareto(t2)> = 0); //コンピレーションエラー、メソッド比較(t)はタイプTの場合は定義されていません。 }コンパイラエラーメッセージが表示されます。タイプTでは比較方法は定義されていません。タイプをJavaで比較する必要がある場合、同等のインターフェイスを実装する必要があるため、メソッドがオーバーライドされます。次に、次の変更を行います。
public static <tは比較可能> t get(t t1、t t2){//タイプ制限if(t1.compareto(t2)> = 0); T1を返します。 }適格なTが比較可能になることにより、Tは比較可能なインターフェイスのタイプであることを示し、したがって比較方法も実装するため、コンパイル時間エラーはありません。
タイプの複数の制限をセグメント化する場合、限られたキーワードを使用してセグメント化することができ、拡張のみを使用できます。同時に、インターフェイスとタイプの両方が存在する場合、クラスは最初にのみ配置でき、以下に示すように1つしか持てません。
<tオブジェクトと比較可能&シリアル化可能>を拡張します
上記の記事では、Java Genericsの役割と基本的な概念について簡単に説明しています。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。