Javaのキャストはなんで使う?変数の型と実体の違いから理解する考え方

最終更新日

Schoo Java入門 初級 第8回 ポリモーフィズム・コレクション

本記事は、Schooの「Java入門 初級【2026年版】」第8回「ポリモーフィズム・コレクション」を学ぶ前後に、「Javaのキャストはなんで使うのか」を整理したい方向けの記事です。

結論からいうと、キャストは「共通の型で持っている変数を、必要なときだけ具体的な型として扱い直す」ために使います。普段は Moveable のような共通の型で扱い、Train だけが持つ処理を呼びたい場面で、Train として扱い直します。

キャストを理解するポイントは、型を変えること自体ではありません。「今の変数の型では見えていないメソッドを、実体に合わせて呼べるようにする」と考えると、使いどころが見えやすくなります。

Schoo コースページ:Java入門 初級【2026年版】

キャストを使うと何ができるのか

キャストを使うと、共通の型で扱うメリットを残したまま、必要な場面だけ具体的なクラスの機能を使えます。

  • 普段は Moveable 型として、move() を共通の呼び出し方で使える
  • 中身が Train だと分かっている場面では、Train として扱い直せる
  • Train 独自の announce() のようなメソッドを呼べる

なぜキャストが必要な状況になるのか

キャストは、次のような場面で出てきます。

  • 共通の型でまとめて扱っているが、一部のクラスだけが持つメソッドを呼びたい
  • 配列やListから取り出した要素を、実際のクラスに合わせて扱い直したい
  • 親クラス型やインターフェース型で受け取った値が、特定のクラスかどうか確認してから処理を分けたい

キャストが必要になるのは、最初から具体的なクラスだけを使っているからではありません。むしろ、複数のクラスを共通の型でまとめて扱おうとした結果、あとから具体的なクラスだけの機能を使いたくなることがあるためです。

たとえば、TrainTaxiWalk をすべて Moveable として扱えば、どれに対しても move() を呼べます。移動する処理だけを考えるなら、このほうが扱いやすくなります。

Moveable m = new Train();
m.move();

ただし、Moveable 型として見ている間は、Train だけが持つ announce() や、Taxi だけが持つ pay() のようなメソッドは見えません。共通の型で扱うメリットがある一方で、個別のクラスの機能はそのままでは呼べなくなる、ということです。

この「共通の型で扱っているが、今だけ具体的なクラスとして使いたい」という場面でキャストが出てきます。

上のコードでは、実際に作られているオブジェクトは Train です。しかし、変数 m の型は Moveable なので、m から見えるのは基本的に Moveable として扱える範囲です。

図解:変数の型で見える範囲が変わる
変数の型
Moveable m
Moveableとして見ているため、基本的には move() の範囲で扱う
実際のオブジェクト
new Train()
中身はTrainなので、Trainとして扱い直せば announce() も使える
キャストは、変数の中身そのものを別物に変える処理ではありません。実体に合わせて、見え方を扱い直すイメージです。

共通の型では独自のメソッドが見えない

Trainannounce() という独自のメソッドがあるとします。電車としてはアナウンスできますが、Moveable 型の変数として見ている間は、Javaは「これは移動できるもの」として扱います。

Moveable m = new Train();

m.move();
// m.announce(); // Moveableにはannounce()がないため呼べない

ここでキャストを使います。m の実体が Train だと分かっている場合、Train として扱い直すことで、Train 独自のメソッドを呼べます。

Train train = (Train) m;
train.announce();

(Train) m の部分がキャストです。ここでは「m の中身を Train として扱い直す」という意味になります。

中身が違うものはキャストできない

キャストは、実際の中身に合っている場合にだけ使えます。たとえば m の中身が Walk なのに、Train として扱おうとすると問題になります。

Moveable m = new Walk();

Train train = (Train) m; // 実行時にエラーになる

文法上は書けても、実際のオブジェクトが Train でなければ、Train として扱うことはできません。キャストは「中身を別のクラスに変える処理」ではない点に注意が必要です。

instanceofで確認してからキャストする

安全に扱うには、キャストする前に instanceof で中身を確認します。

Moveable m = new Walk();

if (m instanceof Train) {
    Train train = (Train) m;
    train.announce();
} else {
    System.out.println("Trainではありません");
}
図解:確認してからキャストする
1. まず中身を確認する
if (m instanceof Train)
2. Trainだった場合だけ扱い直す
Train train = (Train) m;
3. Train独自のメソッドを呼ぶ
train.announce();
キャスト前に instanceof で確認すると、違う型に無理やりキャストする失敗を避けやすくなります。

キャストはなぜ多用しないほうがよいのか

キャストを使うと、親クラス型やインターフェース型で持っている変数を、具体的なクラスとして扱い直せます。ただし、あちこちでキャストが必要になる場合は、「本当に共通の型で扱う設計になっているか」を見直したほうがよいこともあります。

まずは、共通して呼べるメソッドは共通の型のまま使います。そのうえで、どうしても具体クラス独自のメソッドが必要な場面だけキャストを使う、と考えるとよいでしょう。

確認問題

  1. キャストは、どのような場面で必要になりますか。
  2. Moveable m = new Train(); と書いたとき、m.announce(); が呼べない理由は何ですか。
  3. キャスト前に instanceof で確認する理由は何ですか。

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

あわせて読みたい関連記事

まとめ

キャストは、共通の型で扱っている変数を、必要なときだけ具体的な型として扱い直すための書き方です。変数の中身を別のオブジェクトに変える処理ではありません。キャストするときは、実体がその型であることを確認してから使うようにしましょう。

info

シェアする