ジェネリックメソッドとジェネリッククラス
型パラメータを持つジェネリッククラスを定義し、戻り値の型の前に <T> を置くジェネリックメソッドを記述します。型推論が役立つ場面も学びます。
「ジェネリックメソッドとジェネリッククラス」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全3レッスンが含まれています。
概要
ジェネリッククラスは1つの設計を多くの型で再利用でき、ジェネリックメソッドはジェネリックではないクラスの中でも型パラメーターを使って動作します。ここでは小さなPair<T,U>、swapメソッド、静的ファクトリを作成します。
なぜジェネリッククラスなのか
なぜクラスをジェネリックにするのでしょうか?
- 1つの設計で多くの型:重複を減らせます。
- 型安全性:間違った型をコンパイル時に検出できます。
- 明確なAPI:戻り値でキャストする必要がありません。
コード:Pair<T,U>
Pair<T,U>は同じクラスを2つの異なる型で使用できます。キャストは不要で、APIも明確です。
public class Main {
// Simple generic data holder with two type parameters
static class Pair<T, U> {
private final T first;
private final U second;
Pair(T first, U second) { this.first = first; this.second = second; }
T first() { return first; }
U second() { return second; }
public String toString() { return "Pair(" + first + ", " + second + ")"; }
}
public static void main(String[] args) {
Pair<String, Integer> p = new Pair<>("age", 21);
System.out.println(p);
System.out.println(p.first() + " -> " + p.second());
}
}
ジェネリックメソッド:シグネチャ
ジェネリックメソッドは、クラス自体がジェネリックかどうかに関係なく動作します。シグネチャ:<T> returnType... 例:<T> T firstOrDefault(T[] arr, T def)。
コード:ジェネリックなswap
<T>をメソッドレベルで定義したため、異なる配列で動作します。呼び出し時に型を指定していませんが、コンパイラーが推論します。
public class Main {
// Generic utility method: swap two indices of an array of any reference type
static <T> void swap(T[] arr, int i, int j) {
T tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
public static void main(String[] args) {
String[] names = { "Ada", "Bob", "Cyd" };
swap(names, 0, 2); // works with String[]
for (int k = 0; k < names.length; k = k + 1) {
System.out.print(names[k] + (k < names.length - 1 ? " " : "\n"));
}
}
}
コード:静的ジェネリックファクトリ
静的ジェネリックファクトリ:of(T v)を呼び出すと、型が推論されます。使い方がすっきりして読みやすくなります。
public class Main {
static class Box<T> {
private final T value;
private Box(T v) { this.value = v; }
public T get() { return value; }
// Static generic factory method inside a generic class
public static <T> Box<T> of(T v) { return new Box<T>(v); }
}
public static void main(String[] args) {
// Type inferred by diamond and method generic parameter
Box<Integer> bi = Box.of(42);
Box<String> bs = Box.of("hi");
System.out.println(bi.get() + 1);
System.out.println(bs.get().toUpperCase());
}
}
ジェネリックメソッドのチェック
クイックチェック:ジェネリックメソッドはどのように宣言すれば正しいですか?
まとめ
まとめ:ジェネリッククラス(Pair<T,U>)は重複を減らし、ジェネリックメソッド(<T>シグネチャ)はクラスとは独立して動作します。型推論によって呼び出しが簡潔になります。
よくある質問
「ジェネリックメソッドとジェネリッククラス」レッスンは無料ですか?
はい。「ジェネリックメソッドとジェネリッククラス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全3レッスンが含まれています。
「ジェネリックメソッドとジェネリッククラス」で何を学びますか?
型パラメータを持つジェネリッククラスを定義し、戻り値の型の前に <T> を置くジェネリックメソッドを記述します。型推論が役立つ場面も学びます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。
「ジェネリックメソッドとジェネリッククラス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 実践で使うインターフェース
- ジェネリクスの基礎(T、型推論)
- ジェネリックメソッドとジェネリッククラス