Groovy-ジェネリック
ジェネリックスを使用すると、クラス、インターフェイス、およびメソッドを定義するときに、型(クラスとインターフェイス)をパラメーターにすることができます。メソッド宣言で使用されるより馴染みのある仮パラメーターと同様に、型パラメーターは、同じコードを異なる入力で再利用する方法を提供します。違いは、仮パラメーターへの入力が値であるのに対し、型パラメーターへの入力は型であるということです。
コレクションのジェネリック
Listクラスなどのコレクションクラスは、そのタイプのコレクションのみがアプリケーションで受け入れられるように一般化できます。一般化されたArrayListの例を以下に示します。次のステートメントは、文字列タイプのリストアイテムのみを受け入れるということです。
List<String> list = new ArrayList<String>();
次のコード例では、次のことを行っています。
- 文字列のみを保持するGeneralizedArrayListコレクションを作成します。
- リストに3つの文字列を追加します。
- リスト内の各項目について、文字列の値を出力します。
class Example {
static void main(String[] args) {
// Creating a generic List collection
List<String> list = new ArrayList<String>();
list.add("First String");
list.add("Second String");
list.add("Third String");
for(String str : list) {
println(str);
}
}
}
上記のプログラムの出力は次のようになります-
First String
Second String
Third String
一般化されたクラス
クラス全体を一般化することもできます。これにより、クラスは任意のタイプを受け入れ、それに応じてそれらのタイプを操作する際の柔軟性が高まります。これを実現する方法の例を見てみましょう。
次のプログラムでは、次の手順を実行しています-
ListTypeというクラスを作成しています。クラス定義の前に配置された<T>キーワードに注意してください。これは、このクラスが任意の型を受け入れることができることをコンパイラーに通知します。したがって、このクラスのオブジェクトを宣言するときに、宣言中に型を指定すると、その型がプレースホルダー<T>に置き換えられます。
汎用クラスには、クラスで定義されたメンバー変数を操作するための単純なgetterメソッドとsetterメソッドがあります。
メインプログラムでは、ListTypeクラスのオブジェクトを宣言できますが、タイプが異なることに注意してください。最初のものは整数型で、2番目のものは文字列型です。
class Example {
static void main(String[] args) {
// Creating a generic List collection
ListType<String> lststr = new ListType<>();
lststr.set("First String");
println(lststr.get());
ListType<Integer> lstint = new ListType<>();
lstint.set(1);
println(lstint.get());
}
}
public class ListType<T> {
private T localt;
public T get() {
return this.localt;
}
public void set(T plocal) {
this.localt = plocal;
}
}
上記のプログラムの出力は次のようになります-
First String
1