1. 通常の文字列を渡すと Box[...] の形で返る
  2. Java という文字列を渡すと Box[Java] が返る
  3. 空文字を渡すと Box[] が返る
  4. 日本語の文字列もそのまま包める
コース一覧
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分

ジェネリッククラスを作る

Object で受けると、取り出すたびにキャストが要る

何か 1 つ値を持っておくクラスを、型を決めずに書くとフィールドは Object になります。

Java

public class Memo { private Object body; public Object read() { return body; } }

入れるほうは何でも通りますが、取り出すほうが困ります。String text = memo.read(); は通らないので (String) memo.read() とキャストが要り、間違った型でキャストしてもその場では気づけません。実行して初めて ClassCastException で落ちます。数値のつもりの箱に文字列が入っていても、コンパイラは何も言ってくれません。

型は、使う人に決めてもらう

クラス名の右に <T> を書くと、中身の型は使う人が決める、という宣言になります。

Java

public class Memo<T> { private T body; public Memo(T body) { this.body = body; } public T read() { return body; } }

T は、あとで型が入る場所を押さえておくための札です。実体が決まるのは new するときです。

Java

Memo<String> note = new Memo<>("牛乳を買う"); String text = note.read(); // キャストは要らない Memo<Integer> count = new Memo<>(3); int n = count.read();

Memo<String> に数値を渡そうとすれば、実行する前にコンパイラが止めてくれます。new Memo<>(...) の山かっこが空なのは、左側に書いた型からコンパイラが埋めてくれるからです。

T に書けるもの、書けないもの

型パラメータの名前には 1 文字の大文字を使う慣習があり、意味ごとにだいたい決まっています。汎用の型なら T、コレクションの要素なら E、キーと値のペアなら K と V です。文法上は好きな名前を付けられますが、慣習から外れるとクラス名と見分けが付かなくなります。

書けない型もあります。Memo<int> とは書けないので、Memo<Integer> のようにラッパー型を使います。また Memo memo = new Memo("x"); と山かっこを省く書き方も文法としては残っていますが、中身が Object 扱いに戻ってしまうので使いません。

課題では、値を 1 つ包んで取り出せるジェネリッククラスを自分で定義し、Solution の中から使います。1 つのファイルにクラスを 2 つ書くか、static を付けた入れ子のクラスにするかのどちらかです。取り出した値を、指定された形の文字列に組み立てて返してください。

要件

  1. Solution クラスの中 (もしくは同ファイル) に、型パラメータ <T> を持つ Box 相当のジェネリッククラスを定義すること
  2. Box クラスは値を保存するフィールドと、それを取り出す getValue() 相当のメソッドを持つこと (raw 型 Box のままにせず、必ず <> で型を指定すること)
  3. boxedValue の内部で Box<String> を生成し、getValue() で取り出した値を使って "Box[" + value + "]" の文字列を返すこと

入出力例

boxedValue("hello") → "Box[hello]" boxedValue("Java") → "Box[Java]" boxedValue("") → "Box[]" boxedValue("こんにちは") → "Box[こんにちは]"

ヒント

`static class Box<T> { private T value; public Box(T value) { this.value = value; } public T getValue() { return this.value; } }` のように、`Solution` の中に `static` な内部クラスとして定義するのが手軽です

`Box<String> box = new Box<>(s);` のようにダイヤモンド演算子 `<>` を使うと、型を 2 回書かずに済みます

戻り値は `return "Box[" + box.getValue() + "]";` のように、文字列連結で組み立てれば OK です。`"Box["` と `"]"` の中に `getValue()` の結果を挟み込むイメージです

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

関連レッスン

  • ジェネリックメソッド

    型パラメータをメソッド単位で宣言する `ジェネリックメソッド` を学び、配列やリストの先頭要素を返す汎用処理の書き方を身につけよう。

  • 境界型パラメータ

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

  • ワイルドカード ?

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

  • Pair<K,V> を作る

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

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

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

  • instanceof「このオブジェクトの実際の型は何か」を確認 → 安全に変換
  • クラスデータと振る舞いを束ねる単位
  • フィールドクラスが持つデータ
  • メソッドクラスに属する関数
main.java
学習モード
エディタを読み込んでいます

メモ

ジェネリッククラスを作る

⌘S で保存