Scala之类型转换以及asInstanceOf和isInstanceOf介绍

scala的类型转换一般用对象名.to方法可以实现简单的数据类型转换,
和java中的类型准换有很多相似之处。

基本数据类型转换

1. String类型转其它数据类型

toInt

var a = "123"
a.toInt      //123

注意:
String类型中的值必须是数字,不然就转换不了

toDouble

var a = "123"
a.toDouble     //123.0

toFloat

var a = "123"
a.toFloat    //123.0

toLong

var a = "123"
a.toLong    //123

2. 其它基本数据类型转换为String

Int 转换为String

var a = 123
var b = a.toString      
//  b: String = 123

Double 转换为String

var a = 123.1
var b = a.toString      
//  b: String = 123.1

3.Int转换Double之doubleValue

var a = 123
var b = a.doubleValue     
//  b: Double = 123.0

4. Double转换Long之longValue

var a = 123.0
var b = a.longValue 
//  b:Long = 123

5. Double转换Int之intValue

var a = 123.0
var b = a.intValue 
//  b:Int= 123

6. 用(成员)方法转换而不是强制类型转换

scala> 99.4.toInt
Int = 99
scala> 99.4.toInt.toChar
Char = c
scala> "99.4".toDouble
Double = 99.4

7. 隐式参数与隐式转换

scala 的 REPL 中使用 scala> :implicit -v查看 Predef.scala 中定义的全部隐式转换函数;
全部由implicit修饰;
1 to 10等价于 1.to(10)
.to 不是 Int.scala 中的方法,而是 RichInt.scala 中的方法;

8. Integer.valueOf

可将整型或者字符串型转换为Integer型,字符串的值必须是Int型

var a = 12
var b= Integer.valueOf(a)
//b: Integer = 12

或者
var a = "12"
var b= Integer.valueOf(a)
//b: Integer = 12

9. String.valueOf

可将任一类型数据转换为字符串类型(包括字符数组)

var a = 12
var b= String.valueOf(a)
//b: String = 12

var a = "12"
var b= String.valueOf(a)
//b: String = 12

var a = 12.0
var b= String.valueOf(a)
//b: String = 12.0

10. asInstanceOf[T]

将引用转换为子类的引用,就是对象类型强制转换成T类型

//Int转换为Double
var a = 12
a.asInstanceOf[Double]
// Int = 12

注意:
当Int类型转换 为String类型,或者是String类型转换为Int类型时,在运行时会抛出ClassCastException异常:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

这是由于泛型存在类型擦除的原因导致的,但是把值放到集合之中后再去转换就会不会报错了。

var a = List(12)
a.asInstanceOf[List[String]]
// List[String] = List(12)

var a = List("12")
a.asInstanceOf[List[Int]]
//List[Int] = List(12)

还有,值得提一下的一个小细节就是,通过观察编译输出的AST, 知道对于在基本类型如Int等的对象上调用asInstanceOf[T], Scala会将其转换为调用相应的toT方法, 如 1.asInstanceOf[Char], 就会转换为 97.toChar, 其中toChar 定义在 scala.Int;
而后, Scala编译器会进一步将其编译成与“(char)97”相同的字节码。

11.isInstanceOf[T]

判断对象是否为T类型的实例,是就返回true,不是据返回flase

scala> 1.isInstanceOf[String]
res0: false

scala> List(1).isInstanceOf[List[String]]
res0: true

由于Scala像Java一样泛型存在类型擦除的原因,List(1).isInstanceOf[List[String]]就相当于List(1).isInstanceOf[List[ _ ]], List(1) 是List的实例.

总结:
我们可以把obj.isInstanceOf[T]看成 obj instanceof T, obj.asInstanceOf[T]看成(T)obj就对了。scala为我们提供了语法糖,但也免不了类型擦除问题的影响。

你可能感兴趣的:(scala)