如果实例化了子类的对象,但是将其赋予了父类类型的变量,在后续的过程中,又需要将父类类型的变量转换为子类类型的变量,应该如何做?
Ø 首先,需要使用isInstanceOf 判断对象是否为指定类的对象,如果是的话,则可以使用 asInstanceOf 将对象转换为指定类型;
Ø 注意:p.isInstanceOf[XX] 判断 p 是否为 XX 对象的实例;p.asInstanceOf[XX] 把 p 转换成 XX 对象的实例
Ø 注意:如果没有用isInstanceOf 先判断对象是否为指定类的实例,就直接用 asInstanceOf 转换,则可能会抛出异常;
Ø 注意:如果对象是 null,则isInstanceOf 一定返回 false, asInstanceOf 一定返回 null;
Ø Scala与Java类型检查和转换
Scala |
Java |
obj.isInstanceOf[C] |
obj instanceof C |
obj.asInstanceOf[C] |
(C)obj |
classOf[C] |
C.class |
Ø 举例说明:
package cn.itcast.extends_demo class Person3 {} class Student3 extends Person3 object Student3{ def main (args: Array[String] ) { val p: Person3 = new Student3 var s: Student3 = null //如果对象是 null,则 isInstanceOf 一定返回 false println (s.isInstanceOf[Student3]) // 判断 p 是否为 Student3 对象的实例 if (p.isInstanceOf[Student3] ) { //把 p 转换成 Student3 对象的实例 s = p.asInstanceOf[Student3] } println (s.isInstanceOf[Student3] ) } }
1.1.1. Scala中getClass 和 classOf
Ø isInstanceOf 只能判断出对象是否为指定类以及其子类的对象,而不能精确的判断出,对象就是指定类的对象;
Ø 如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 了;
Ø p.getClass 可以精确地获取对象的类,classOf[XX]可以精确的获取类,然后使用 == 操作符即可判断;
Ø 举例说明:
package cn.itcast.extends_demo class Person4 {} class Student4 extends Person4 object Student4{ def main(args: Array[String]) { val p:Person4=new Student4 //判断p是否为Person4类的实例 println(p.isInstanceOf[Person4])//true //判断p的类型是否为Person4类 println(p.getClass == classOf[Person4])//false //判断p的类型是否为Student4类 println(p.getClass == classOf[Student4])//true } }