类型转换与类型判断
子类转父类的实现
-
定义一个子类,用一个父类对象指向即可
-
子类中包含了父类中所有的方法和属性,可以直接转换
//构建一个子类的实例,使用父类指向,只能调用父类的属性和方法
val s2: Person04 = new Student04
println(s2.name+"\t"+s2.age)
s2.sayHello
父类转子类的问题
-
父类不能转换为子类,除非本身指向的就是一个子类的对象才可以实现
-
必须提前判断,如果不判断,会出现类型转换异常
//例如s2的情况:可以实现将s2转换为一个Student04的对象
s2.asInstanceOf[Student04] //类似于Java中 :Student04 s3 = (Student04)s2
//上面这种写法的前提是:明确的知道s2本质是一个Student04的对象
粗略类型判断与转换
-
isInstanceOf:用于判断是否是对应的类型
-
asInstanceOf:用于转换为对应的类型
-
判断与转换
//实际工作中进行强制类型转换时,先判断后转换,避免程序出错
if(s2.isInstanceOf[Student04]) {
s2.asInstanceOf[Student04]
}
不精准
精准类型判断与转换
-
getClass:获取对象的类型
-
ClassOf:获取类的类型
-
判断与转换
if(s2.getClass == classOf[Student04]){
s2.asInstanceOf[Student04]
}
精准
完整代码
class Person04 {
var name:String = "itcast"
var age:Int = 20
def sayHello = println("Hello,Person")
}
class Student04 extends Person04 {
var stuId:String = "001"
def sayBye = println("Bye ,Person")
}
object TestPerson04{
def main(args: Array[String]): Unit = {
//构建一个子类的实例,使用子类指向,标准的student类型的对象
val s1: Student04 = new Student04
// println(s1.name+"\t"+s1.age) //父类的
// s1.sayHello
// println(s1.stuId) //子类的
// s1.sayBye
//构建一个子类的实例,使用父类指向,只能调用父类的属性和方法
val s2: Person04 = new Student04
// println(s2.name+"\t"+s2.age)
// s2.sayHello
//如何将一个父类转换为一个子类?:如果一个父类指向的是一个子类的对象才可以实现转换
//例如s2的情况:可以实现将s2转换为一个Student04的对象
// s2.asInstanceOf[Student04] //类似于Java中 :Student04 s3 = (Student04)s2
//上面这种写法的前提是:明确的知道s2本质是一个Student04的对象
//实际工作中进行强制类型转换时,先判断后转换,避免程序出错
// if(s2.isInstanceOf[Student04]) {
// s2.asInstanceOf[Student04]
// }
//这种判断属于粗略的类型判断,不精确
// println(s2.isInstanceOf[Person04])
// println(s2.isInstanceOf[Student04])
// if(s2.getClass == classOf[Student04]){
// s2.asInstanceOf[Student04]
// }
println(s2.getClass == classOf[Person04])
println(s2.getClass == classOf[Student04])
}
}
点个赞嘛!