あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

キャスト

Scalaでも型のキャストができる。
が、本来はキャストが不要なプログラムにするべき。

汎用的な型でコレクションを作成すると本来の型にキャストしてしないと
処理できない場合がでてくる。

Any で List をつくると、要素を取り出して加算を行う場合は "+" の数値演算(メソッド)が
Any では定義されていないためキャストが必要になってくる。
この場合は Any で定義しているメソッド asInstanceOf を使用してキャストができる。

scala> val foo = List[Any](5, 6, 7)
foo: List[Any] = List(5, 6, 7)

scala> foo.head
res0: Any = 5

scala> foo.init
res1: List[Any] = List(5, 6)

scala> res1(0)
res2: Any = 5

scala> res2.asInstanceOf[Int] + 5
res3: Int = 10

asInstanceOf[キャストしたい型] の形式で、キャストする。
キャストできない型を間違って指定すると、ClassCastException が発生する。

scala> res2.asInstanceOf[String]
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
        at .<init>(<console>:11)
        at .<clinit>(<console>)
..snip..