instanceof と Class#isInstance

動的に使える以外に違いはないわけだけど、isInstanceもたまには思い出してあげてください。

boolean isHoge = (obj instanceof Hoge);
boolean isHoge = Hoge.class.isInstance(obj);

これらは等価なわけです。

でも、SJCちっくな問題を2つほど解いてみましょう。

Q1.isInteger はどうなるか?

int num = 10;
boolean isInteger = (num instanceof Integer);

1. true
2. false
3. コンパイルエラー
4. 実行時例外

Q2.isInteger はどうなるか?

int num = 10;
boolean isInteger = Integer.class.isInstance(num);

1. true
2. false
3. コンパイルエラー
4. 実行時例外

解答

1つ目の問題ですが、答えは3のコンパイルエラーです。numがプリミティブなので、instanceofの左辺には置くことができません。
2つ目の問題は、trueになります。numはBoxingによりInteger扱いになってメソッドに渡されるわけですから、書き換えればこうなりますね。

int num = 10;
boolean isInteger = Integer.class.isInstance(new Integer(num));

Boxingは便利ですが、変な所ではまらないように注意しようという話でした。