instanceofとパターン

instanceofとパターン

このレッスンでできるようになること。instanceof の結果を正しく予測し、パターンマッチングで書いたときの変数の使える範囲まで説明できるようになります。

instanceof は、変数の中身がその型として扱えるかどうかを boolean で返します。中身がその型そのものでなくても、サブクラスであれば true です。実装クラスとインターフェースの関係でも同じです。

2つの決まり

1つめは null です。null instanceof String は例外にならず、いつでも false を返します。キャストのほうは null でも成功するので、動きが逆になります。ここは毎回のように問われます。

2つめはコンパイルエラーになる場合です。継承の線でまったくつながっていない型を調べようとすると、結果が必ず false だと分かるためコンパイラが弾きます。たとえば String 型の変数を Integer かどうか調べるとエラーです。Object 型の変数であれば、どんな型を調べても通ります。

パターンマッチング

if (o instanceof String s) { return "len=" + s.length(); }

この s をパターン変数と呼びます。判定が true になった場合だけ中身が代入されるので、キャストを書く行が消えます。使える範囲は、判定が true だと確定している場所だけです。上の例では if の中では使えますが、else の側では使えません。

逆に if (!(o instanceof String s)) { return "no"; } と書いた場合は、その if を抜けたあとの行で s が使えます。true が確定しているからです。この形は試験にもよく出ます。

演習では、3通りの中身を1つのメソッドで振り分けます。

要件

  1. instanceof のパターン変数を使う
  2. 明示的なキャストを書かない
  3. pick() は変更しない

入出力例

classify(1)"String:3" classify(2)"Integer:8" classify(3)"none"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.java
学習モード

メモ

instanceofとパターン

⌘S で保存