ClassCastException

classcastexception.png

猫からライオンに無理矢理キャスト(型変換)してみました
ClassCastExceptionの発生!!

 java.lang.ClassCastException: Cat cannot be cast to Lion

そう簡単にライオンにはなれませんよ!にゃんこちゃん

キャストを使わず、より上位の変数に入れてしまう

たとえば、あるクラスXと、そのサブクラス数種類のデータの組み合わせを 処理するとき、Xのメソッドしか呼び出さないような場合は、 各サブクラスへわざわざキャストせず、Xクラスの変数へ 入れてしまうという方法があります。
これのさらに汎用的なパターンとしては、たとえば、データに対してtoStringだけを実行したい ような場合は、キャストをするかわりに、どんなクラスのオブジェクトでも受け取れる Objectの変数に入れてしまうという、もっとも単純でエラーに強い方法があります。

キャストを実行する前に、instanceof で調べる

調べた結果によって処理を分岐させてやります。 たとえば、マップやリストに数種類のクラスのオブジェクトが入っていて、 それらを1個ずつ処理する場合などは、if文で場合分けを行うということになるでしょう。
ただ、場合分けをした場合、予想外のクラスが来た場合には、どうしようもありません。 結局その場合は何らかのエラー対応処理をするか、例外を投げるか、無視するかという ことになるでしょう。

Java 5以降で使える、クラステンプレートを使う。

これにより、マップやリストの処理で取り出したデータをいちいち キャストする必要がなくなり、また、意図しないクラスがマップやリストに 紛れ込む心配もなくなりますので、より堅牢なプログラムを記述することができるようになります。


cast

サポートサイト Wikidot.com cast