Scala布尔值到字符串的转换

Scala布尔值到字符串的转换,scala,casting,type-conversion,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 为什么后一种尝试失败了 非常感谢在原语上调用toString时,scala编译器会自动执行装箱(将原语放入对象包

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
为什么后一种尝试失败了


非常感谢

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

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

调用asInstanceOf意味着从布尔值转换为字符串时,这些是不同的类型,因此会抛出CCE。

这是因为
布尔值
不是
字符串
的子类型,也不是与
字符串
兼容的类型

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
只保存任意对象引用,因此只要使用正确的类型“取消绑定”,您就是黄金

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
这很好用,只要你小心如何取消装箱,你就不会得到任何错误。在将泛型引入Java语言之前,在Java中就是这样做的。也就是说,如果您将任何一个数组元素强制转换为错误的类型,您将得到强制转换异常

.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)

这样做是为了在必要时可以打印任何类型,而与强制转换无关。

第一种方法不是强制转换,而是在
布尔值
类型上定义的方法。@LimbSoup好的,谢谢,相应地更新了问题公式:)这是因为
布尔值
不是
字符串的子类型。此问题可能重复: