我一直在玩基本的 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)
在第二种情况下,我得到以下结果: int is 123 x is 123 Int x is 123
在这种情况下,代码应该产生 ClasscastException,但它没有。那是我的担心。
- 在第三种情况下,我得到一个 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 中进行转换的基础知识。我知道这个例子无论如何都不是真实世界的例子,但我试图让我的头脑围绕基础知识。