Scala布尔值到字符串转换

时间:2014-07-29 18:45:43

标签: scala casting type-conversion

true: Boolean转换为字符串的一种方法是

scala> true.toString
res: String = true

然而,

scala> true.asInstanceOf[String]
java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String

为什么后者尝试失败?

非常感谢

2 个答案:

答案 0 :(得分:5)

这是因为Boolean不是String的子类型或与String兼容的类型

scala> val a: Any = "Hello"
a: Any = Hello

scala> val b = a.asInstanceOf[String]
b: String = Hello

scala> val c: Char = 123
c: Char = {

scala> val d = c.asInstanceOf[Int]
d: Int = 123

scala> (123).asInstanceOf[Double]
res0: Double = 123.0

scala> (1.3).asInstanceOf[Int]
res1: Int = 1

如您所见,我可以轻松地来回转换任何类型的兼容类型,在这种情况下,数字(包括字符)是交叉兼容的。所有类型都与Any兼容,因为Any只保留任意对象引用,因此只要你" unbox"使用正确的类型,你就是金色的。

scala> val arr = Array("Hello", 245, true)
arr: Array[Any] = Array(Hello, 245, true)

scala> val first = arr(0).asInstanceOf[String]
first: String = Hello

scala> val second = arr(1).asInstanceOf[Int]
second: Int = 245

scala> val third = arr(2).asInstanceOf[Boolean]
third: Boolean = true

这样可以正常使用,只要您小心拆箱,就不会有任何错误。在将泛型引入该语言之前,您就是这样做的。也就是说,如果你将任何一个数组元素强制转换为错误类型,你将获得强制转换异常。

.toString方法与类型转换不同,因为它根本不是转换,它存在作为将任何对象转换为其自身的字符串表示的简洁方式。

scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

scala> a.toString
res0: String = List(1, 2, 3, 4)

这样做是为了在必要时可以打印任何类型,并且与铸造无关。

答案 1 :(得分:0)

在基元上调用toString时,scala编译器会自动执行装箱(将基元放到对象包装器),然后对布尔对象执行toString方法:

public String toString() {
        return value ? "true" : "false";
} 

在调用asInstanceOf时意味着从Boolean转换为String,这些是不同的类型,因此抛出CCE。