Java を勉強していて、ジェネリック メソッドに出くわしました。
public <T> void foo(T variable) { }
つまり、型が未定のパラメーターを取るメソッド (PHP のように?) です。ただし、これがどのように良い解決策になるかはわかりません。特に、緩い言語から来て、強く型付けされた言語に恋をするようになったので。
ジェネリック メソッドを使用する理由はありますか? もしそうなら、いつ?
Java 5 より前のバックグラウンドを持っている人は、オブジェクトを Collection に格納し、それを使用する前に正しい Type にキャストすることがいかに不便であったかを知っています。ジェネリックはそれらを防ぎます。コンパイル時の型安全性を提供し、コレクションに正しい型のみを挿入し、実行時に ClassCastException を回避することを保証します。
したがって、コンパイル時の型安全性とキャストを提供します。複雑なメソッド シグネチャを使用して複雑な API を記述したい場合、API を記述するときと API を使用するときの両方で大幅に節約でき、パーツをキャストするための多くのコードを記述せず、コンパイル時にエラーをキャッチできます。パッケージを見java.util.Collection
て、ソースコードを見てください。
開発者として、私は常にコンパイラがコンパイル時にエラーをキャッチし、コンパイルする必要があるときに通知することを望んでいます。その後、エラーを修正し、実行時に型安全性に関連するエラーはあまりありません。
詳細については、次を参照してください。
ジェネリックは、とりわけ、テンプレートを提供する方法を提供します。つまり、同じことをしたいのですが、唯一の違いは型です。
たとえば、List APIを見ると、メソッドが表示されます
add(E e)
宣言する同じ型のすべてのリストについて、add
メソッドの唯一の違いは、リストに入るものの型です。これは、ジェネリックスが役立つ典型的な例です。(ジェネリックが Java に導入される前は、リストを宣言し、リストに何でも追加できましたが、取得するときにオブジェクトをキャストする必要がありました)
具体的には、2 つの ArrayList インスタンス (1 つは type1 を受け取り、もう 1 つは type2 を受け取る) が必要になる場合があります。のリスト コードadd
は、各リストに対して同じことを行い、同じコードを実行します (2 つのリストは両方ともArrayList
インスタンスであるため) ですよね? したがって、異なるのはリストにあるものだけです。
(@michael が指摘してadd
いるように、ジェネリック メソッドの真の例ではありませんが、リンクされた API には真のジェネリック メソッドがあり、概念は同じです)
一般に、ジェネリック関数について強く型付けされていないものはありません。型はコンパイル時に解決され、チェックされます。それは未決定のタイプではなく、可能なタイプの範囲の1つです(これらは制約される可能性がありますが、あなたの例ではそうではありません)。コンパイル時に認識され、決定されます。
hvgotcodes が言うように、Collections API には、これを使用した良い例が数多く含まれています。
一般的な概念の主な目的は次のとおりです。
String 型のオブジェクトのみを保持するには、ArrayList の Generic バージョンを次のように宣言できます。
ArrayList l = new ArrayList ();