Java-ジェネリック
Integer 配列、String 配列、または順序付けをサポートする任意の型の配列内の要素を並べ替えることができる単一の並べ替えメソッドを記述できればよいでしょう。
Java ジェネリック メソッドとジェネリック クラスにより、プログラマは、単一のメソッド宣言で関連するメソッドのセットを指定するか、単一のクラス宣言で関連するタイプのセットをそれぞれ指定できます。
ジェネリックは、コンパイル時に無効な型をキャッチできるコンパイル時の型安全性も提供します。
Java のジェネリック コンセプトを使用して、オブジェクトの配列を並べ替えるジェネリック メソッドを作成し、整数配列、Double 配列、文字列配列などを使用してジェネリック メソッドを呼び出して、配列要素を並べ替えることができます。
汎用メソッド
さまざまな型の引数で呼び出すことができる単一のジェネリック メソッド宣言を記述できます。ジェネリック メソッドに渡される引数の型に基づいて、コンパイラは各メソッド呼び出しを適切に処理します。以下は、ジェネリックメソッドを定義するためのルールです-
- <リ>
すべてのジェネリック メソッド宣言には、山かっこ (<と>) で区切られた型パラメーター セクションがあり、メソッドの戻り値の型 (次の例では
各型パラメーター セクションには、コンマで区切られた 1 つ以上の型パラメーターが含まれます。型変数とも呼ばれる型パラメーターは、ジェネリック型名を指定する識別子です。
<リ>型パラメーターを使用して、戻り値の型を宣言し、ジェネリック メソッドに渡される引数の型のプレースホルダーとして機能できます。これは、実際の型引数として知られています。
<リ>ジェネリック メソッドの本体は、他のメソッドと同様に宣言されます。型パラメーターは、プリミティブ型 (int、double、char など) ではなく、参照型のみを表すことができることに注意してください。
例
次の例は、単一の汎用メソッドを使用して異なるタイプの配列を出力する方法を示しています-
ライブデモpublic class GenericMethodTest { // generic method printArray public static < E > void printArray( E[] inputArray ) { // Display array elements for(E element : inputArray) { System.out.printf("%s ", element); } System.out.println(); } public static void main(String args[]) { // Create arrays of Integer, Double and Character Integer[] intArray = { 1, 2, 3, 4, 5 }; Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 }; Character[] charArray = { 'H', 'E', 'L', 'L', 'O' }; System.out.println("Array integerArray contains:"); printArray(intArray); // pass an Integer array System.out.println("\nArray doubleArray contains:"); printArray(doubleArray); // pass a Double array System.out.println("\nArray characterArray contains:"); printArray(charArray); // pass a Character array } }
これにより、次の結果が生成されます-
出力
Array integerArray contains: 1 2 3 4 5 Array doubleArray contains: 1.1 2.2 3.3 4.4 Array characterArray contains: H E L L O
境界型パラメータ
型パラメーターに渡すことができる型の種類を制限したい場合があります。たとえば、数値を操作するメソッドは、Number またはそのサブクラスのインスタンスのみを受け入れたい場合があります。これが境界型パラメーターの目的です。
制限付きの型パラメーターを宣言するには、型パラメーターの名前、extends キーワード、その上限を続けてリストします。
例
次の例は、「拡張」(クラスの場合) または「実装」(インターフェースの場合) のいずれかを意味する一般的な意味で extends がどのように使用されるかを示しています。この例は、3 つの Comparable オブジェクトのうち最大のものを返す汎用メソッドです −
ライブデモpublic class MaximumTest { // determines the largest of three Comparable objects public static <T extends Comparable<T>> T maximum(T x, T y, T z) { T max = x; // assume x is initially the largest if(y.compareTo(max) > 0) { max = y; // y is the largest so far } if(z.compareTo(max) > 0) { max = z; // z is the largest now } return max; // returns the largest object } public static void main(String args[]) { System.out.printf("Max of %d, %d and %d is %d\n\n", 3, 4, 5, maximum( 3, 4, 5 )); System.out.printf("Max of %.1f,%.1f and %.1f is %.1f\n\n", 6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 )); System.out.printf("Max of %s, %s and %s is %s\n","pear", "apple", "orange", maximum("pear", "apple", "orange")); } }
これにより、次の結果が生成されます-
出力
Max of 3, 4 and 5 is 5 Max of 6.6,8.8 and 7.7 is 8.8 Max of pear, apple and orange is pear
ジェネリック クラス
ジェネリック クラス宣言は、クラス名の後に型パラメーター セクションが続くことを除いて、非ジェネリック クラス宣言のように見えます。
ジェネリック メソッドと同様に、ジェネリック クラスの型パラメーター セクションには、コンマで区切られた 1 つ以上の型パラメーターを含めることができます。これらのクラスは、1 つ以上のパラメーターを受け入れるため、パラメーター化されたクラスまたはパラメーター化された型として知られています。
例
次の例は、ジェネリッククラスを定義する方法を示しています-
ライブデモpublic class Box<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; } public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); Box<String> stringBox = new Box<String>(); integerBox.add(new Integer(10)); stringBox.add(new String("Hello World")); System.out.printf("Integer Value :%d\n\n", integerBox.get()); System.out.printf("String Value :%s\n", stringBox.get()); } }
これにより、次の結果が生成されます-
出力
Integer Value :10 String Value :Hello World
Java