基本的な Scala データ型で遊んでいます。scala.Any
クラスがここasInstanceOf[T0]: T0
からメソッドを定義していることに気付きました.APIには、「レシーバーオブジェクトをT0型にキャストする」ことができるとあります。この方法を出発点として、Scala でのキャストを調査したいと思いました。また、このトピックに関する他の質問についてstackoverflowを調べたところ、これを思いつきました。
この情報を手にして、ばかげたプログラムを書きました。
package com.att.scala
import com.att.scala.Sheltie
object Casting {
//def foo(x: String){
def foo(x: Int) {
println("x is " + x)
//if(x.isInstanceOf[String])
if(x.isInstanceOf[Int])
println("Int x is " + x)
//println("String x is " + x)
}
def entry() {
//val double: Any = 123.123
val double: Double = 123.23
val int = double.asInstanceOf[Int] //exception expected here
//val str: String = "123"
foo(int)
}
}
私の目標は、次の場合に何が起こるか (およびその理由) を理解することです。1) Any 型から Int へのキャスト。2) Double 型から Int へのキャスト 3) String から Int へのキャスト
最初のケースでは、com.att.scala.Casting.entry としてプログラムを実行したときに、以下のように実行時に ClasscastException が発生しました。例外を以下に示します。
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source) at com.att.scala.Casting$.entry(Casting.scala:17)
2 番目のケースでは、次の結果が得られます: int is 123 x is 123 Int x is 123
この場合、コードは ClasscastException を生成するはずですが、生成しません。それが私の心配です。
- 3 番目のケースでは、classcastexception が発生します。
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
at com.att.scala.Casting$.entry(Casting.scala:20)
この例で、私の目標は Scala でのキャストの基本を理解することです。この例は決して現実世界の例ではないことはわかっていますが、基本的なことを頭に入れようとしていました。