Scala之isInstanceOf与asInstanceOf

isInstanceOf 能判断出对象是否为指定类以及其子类的对象,而不能精确的判断出,对象就是指定类的对象;如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 了。

isInstanceOf[T]

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

// 判断 1 是否为 Double 类型
1.isInstanceOf[Double]  //false
// 判断 List(1) 是否为 List[String]] 类型
List(1).isInstanceOf[List[String]] //true

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

asInstanceOf[T]

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

// 将 12 强制转换为 Double 类型
12.asInstanceOf[Double] // 12.0

当Int类型转换为String类型,或者是String类型转换为Int类型时,在运行时会抛出ClassCastException异常,这是由于泛型存在类型擦除的原因导致的,但是把值放到集合之中后再去转换就会不会报错了。

// Int类型强制转换为Sting类型
12.asInstanceOf[String] // ClassCastException
// List[Int] 强制转换为List[String]
List(12).asInstanceOf[List[String]] // List[String] = List(12)

getClass 与 classOf

p.getClass 可以精确地获取对象的类,classOf[XX]可以精确的获取类,然后使用 == 操作符即可判断。

class Person {}
class Student extends Person

val p:Person = new Student
//判断p是否为Person类的实例
println(p.isInstanceOf[Person])  //true
//判断p的类型是否为Person类
println(p.getClass == classOf[Person])  //false
//判断p的类型是否为Student类
println(p.getClass == classOf[Student])  //true

你可能感兴趣的:(Scala,scala,开发语言,后端)