1. [5, 10, 15] の先頭は 5
  2. 空配列なら 0
  3. 要素が 1 個だけ {42} の先頭は 42
  4. 負の数を含む {-3, -1, -2} の先頭は -3
コース一覧
Java 中級:コレクション・Stream・例外処理
ジェネリックメソッド

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

ジェネリックメソッド

型ごとに、同じメソッドを書き写している

配列の 2 つの要素を入れ替える処理を、型ごとに用意するとこうなります。

Java

public static void swap(String[] items, int i, int j) { String tmp = items[i]; items[i] = items[j]; items[j] = tmp; } public static void swap(Integer[] items, int i, int j) { Integer tmp = items[i]; items[i] = items[j]; items[j] = tmp; }

中身はまったく同じで、違うのは型の名前だけです。Double や LocalDate が必要になれば、そのたびに同じ 5 行が増えていきます。かといって Object[] で受けると、呼び出し側で型が失われてしまいます。

クラス全体を <T> 付きにする手もありますが、入れ替えたいだけのために専用のクラスを作るのは大げさです。こういうときは、メソッド 1 つに型パラメータを付けます。

<T> は戻り値の型の直前に書く

Java

public static <T> void swap(T[] items, int i, int j) { T tmp = items[i]; items[i] = items[j]; items[j] = tmp; }

static と void の間に挟まっている <T> が、このメソッドの中だけで通じる型 T をここで宣言します、という印です。位置は文法で決まっていて、修飾子のあと、戻り値の型の直前です。public <T> static void のように順番を入れ替えたり、戻り値の型より後ろに書いたりするとコンパイルエラーになります。

宣言した T は、引数の型でも、戻り値の型でも、メソッドの中の変数でも使えます。有効なのはこのメソッドの中だけで、隣のメソッドの T とは何の関係もありません。

呼ぶときは <String> を書かない

型パラメータは、呼び出し側で明示することもできます。

Java

String[] names = {"sato", "abe"}; Util.<String>swap(names, 0, 1); // 書けるが、普段は書かない Util.swap(names, 0, 1); // 引数から T は String だと分かる

コンパイラは渡された引数の型を見て T が何かを判断します。これを型推論と呼び、new ArrayList<>() の空の山かっこが通るのも同じ仕組みです。明示するのは、引数からは決めようがない場面だけです。

課題のメソッドは int[] を受け取る形で最初から決まっています。プリミティブ型の配列は T[] では受けられないため、ここは型パラメータの出番ではありません。シグネチャはそのままにして、中身だけを書いてください。要素が 1 つも無いときにどうするかを先に決めてから、残りを書くと迷いません。

要件

  1. メソッドは public static int firstOf(int[] arr) のシグネチャを維持すること
  2. arr.length == 0 のとき 0 を返すこと
  3. 空でないときは arr[0] をそのまま return すること (arr[1] などにしない)

入出力例

firstOf([5,10,15]) → 5 firstOf([]) → 0 firstOf([42]) → 42 firstOf([-3,-1,-2]) → -3

ヒント

配列の長さは `arr.length` で取得できます (`ArrayList` の `size()` と違ってメソッドではなくフィールドです)

`if (arr.length == 0) return 0;` のようにガード節を先に書くと、本体がスッキリします

本文の `<T> T firstOf(List<T> list)` 版が頭にあると、`int[]` での実装も自然に書けます。`list.isEmpty()` が `arr.length == 0`、`list.get(0)` が `arr[0]` に対応します

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 境界型パラメータ

    ジェネリクスの型パラメータに `extends` で上限を付ける境界型パラメータを学び、`Number` を継承した型だけを受け取って合計を計算するメソッドを書いてみよう。

  • ワイルドカード ?

    ジェネリクスのワイルドカード `?` と上限境界 `? extends T` 下限境界 `? super T` を学び、PECS の原則で使い分けられるようになろう。

  • Pair<K,V> を作る

    複数の型パラメータを持つジェネリッククラス Pair<K,V> を題材に、HashMap<K,V> と同じ仕組みでキーと値の組を表現する方法と、Record を使った最新の書き方を学ぼう。

  • ジェネリクス まとめクイズ

    ジェネリッククラス / ジェネリックメソッド / 境界型 / ワイルドカード / Pair の総まとめ。PECS や型消去 (type erasure) など実務で問われやすい論点を 4 択クイズで確認する。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • メソッドクラスに属する関数
  • 配列サイズ固定の同型データの集まり
  • 処理計算や代入を表す長方形
  • クラスデータと振る舞いを束ねる単位
  • 戻り値呼び出し元への返答を表す点線矢印
  • コンパイルソースをバイトコードへ変換する処理
  • 引数位置引数=順番で渡す。
  • 変数データに名前をつけて参照する仕組み
main.java
学習モード
エディタを読み込んでいます

メモ

ジェネリックメソッド

⌘S で保存