1. String が渡されたら length を含む文字列を返す
  2. 空文字 String でも length=0 が返る
  3. Integer が渡されたら値を含む文字列を返す
  4. Integer の 0 でも正しく扱える
  5. Double のようにそれ以外の型なら Other を返す
コース一覧
Java 中級:コレクション・Stream・例外処理
instanceof と型パターン

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分

instanceof と型パターン

Object のまま受け取ると、何も呼べない

設定ファイルから読んだ値のように、「入っているものが Object としか分からない」変数があります。中身が Boolean でも Double でも、宣言された型が Object である以上、そのままでは Object のメソッドしか呼べません。

いきなりキャストすれば呼べますが、予想が外れたときは ClassCastException で実行時に落ちます。落とさずに済ませるには、キャストの前に型を確かめる必要があります。

確かめて、その場で受け取る

変数 instanceof 型名 新しい変数名 と書くと、型の判定と取り出しが 1 行で終わります。

Java

static String label(Object v) { if (v instanceof Boolean b) { return b ? "オン" : "オフ"; } if (v instanceof Double d) { return d + " 秒"; } return "未対応"; }

v の中身が Boolean のときだけ if の中に入り、そこでは b が Boolean 型の変数として使えます。キャストはコンパイラが入れてくれるので、型名を書き間違えて別の型でキャストする事故が起きません。

宣言した変数を使えるのは、判定が真だと分かっている範囲だけです。&& の右側なら安全に使えます。

Java

if (v instanceof Double d && d > 0) { System.out.println("正の値です"); }

|| でつないだ場合は、判定が偽でも右側に到達しうるため使えません。そこもコンパイラが見てくれます。

解説

以前は if (v instanceof Double) { Double d = (Double) v; ... } と、確かめてからもう一度キャストを書いていました。いまは上の形だけ覚えれば足ります。

null は必ず false になる

instanceof は左辺が null のとき、右にどんな型を書いても false を返します。null かどうかを別に確かめる必要はありません。逆に「null のときだけ別扱いしたい」なら、instanceof より前に自分で if (v == null) を書きます。

分岐が増えてきたら switch でも同じ型パターンが使えます。case Boolean b -> のように書けて、case null も枝の 1 本として置けます。

やってみよう

describeObject(Object o) を完成させてください。見分ける型は 2 つです。

  1. o が String のとき、"String:length=" に文字数をつなげて返す
  2. o が Integer のとき、"Integer:" に値をつなげて返す
  3. どちらでもないとき (Double や null を含む) は "Other" を返す

型パターンで受け取った変数から length() を呼べば、キャストは 1 つも書かずに済みます。空文字は文字数 0 なので "String:length=0"、null は手順 3 に落ちて "Other" になります。

要件

  1. o instanceof String で String 判定をして、"String:length=" + 文字数 を返すこと
  2. o instanceof Integer で Integer 判定をして、"Integer:" + 値 を返すこと
  3. 上記いずれにも該当しない場合 (Double, null など) は "Other" を返すこと

入出力例

describeObject("hello") → "String:length=5" describeObject("") → "String:length=0" describeObject(42) → "Integer:42" describeObject(0) → "Integer:0" describeObject(3.14) → "Other"

ヒント

Java 16 以降なら `if (o instanceof String s) { return "String:length=" + s.length(); }` のようにパターンマッチングが使えます

古い書き方なら `if (o instanceof String) { String s = (String) o; ... }` のようにキャストします

`null` に対する `instanceof` はすべて `false` を返すので、自然に `"Other"` の枝に流れます

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

関連レッスン

  • ポリモーフィズムを活かす

    親クラス Shape の area() を子クラス Circle と Square がそれぞれ独自に実装し、List<Shape> にまとめて合計面積を求めるコードを書きながら、ポリモーフィズムの本質である動的ディスパッチを体感しよう。

  • 継承とポリモーフィズム まとめクイズ

    中級「継承とポリモーフィズム」章の総まとめ。`extends` / `super` / `@Override` / `abstract` / `interface` / `default` / `instanceof` / ポリモーフィズムの使い分けを 4 択で総ざらいする、コース最終クイズ。

  • default メソッド

    Java 8 で導入された interface の default メソッドの使い方と、後方互換性を保ちながら共通実装を提供する仕組みを学び、英語版あいさつメソッドを書いてみよう。

  • interface で契約を定義

    Java の interface を使って「契約」だけを定義し、implements で複数のクラスに同じ振る舞いを約束させる方法を学ぼう。

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

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

  • 変数データに名前をつけて参照する仕組み
  • メソッドクラスに属する関数
  • instanceof「このオブジェクトの実際の型は何か」を確認 → 安全に変換
main.java
学習モード
エディタを読み込んでいます

メモ

instanceof と型パターン

⌘S で保存