开发者学堂课程【Scala 核心编程-基础:类型转换和最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8972
类型转换和最佳实践
内容介绍
一、基本介绍
二、最佳实践
一、基本介绍
要测试某个对象是否属于某个给定的类,可以用 islnstanceOf 方法。用 aslnstanceOf 方法将引用转换为子类的引用。classOf 获取对象的类名。
分辨什么情况用 aslnstanceOf,什么情况用 islnstanceOf。
(1) classOf[String]就如同 Java 的 String.class 。
(2)obj.islnstanceOf[T]就如同 Java 的 obj instanceof
T 判断 obj 是不是 T 类型。
(3)obj.aslnstanceOf[T]就如同 Java 的(T)obj 将 obj 强
转成T类型。(转换强转成需要的类型)
前面案例基础演示+文档
举例:(代码说明)
Name:TypeConvert
package com.atguigu.chaptero7.myextends
object Typeconvert {
def main(args : Array[string]): unit = {
// classof 的使用,可以得到类名
println(classof[string])//输出 (这里就可以直接输出类名)
val s = "king"
println(s.getclass.getName)//使用反射机制
这里也可以得到名称
//isinstanceof asinstanceof
var p1 = new Person200
var emp = new Emp200
//将子类引用给父类( 向上转型,自动)
P1=emp
(在这里将子类给父类是没有问题的,但是因为一些原因有时候需要将一些父类的引用重新转换成对应的原先的子类)
//将父类的引用重新转成子类引用(多态),即向下转型
(有的时候在多态的时候就会用到这个特点,因为在多态的时候会出现很多子类交给父类引用的情况,但是此时如果在里面判断是哪一个子类的话,此时就要用到在这个方法)
Var emp2=p1(这里现在还是父类的引用,此时在这里还是子类,此时的p1是一个父类).asinstanceOf[Emp200](此时转型成功就可以调子类的方法,如果这一步没有转成功是没有办法转到子类的say hello)
emp2.sayHello()
//获取对象类型
println(classOf[String])
val s ="zhangsan""(这里写一个变量的名称。)
println(s.getclass.getName)这种是 Java 中反射方式得到类型
printn(s.islnstanceOf[string])
println(s.aslnstanceof[stringl//将 s 显示转换成 string
var p= new Person2
vale = new Emp
p=e//将子类对象赋给父类。
p.name= "xex""
printin(e.name)
p.asinstanceof[Emp].sayHi
}
}
/ / Person 类
class person200{(这里将名字改为200就不会冲突)
var name : string = "tom"
def printName() { //输出名字
println("Person printName() " + name)
}
def sayHi(): unit = {
println( "sayHi. . .")
}
}
//这里我们继承 Person
class Empe extends Person200 {
//这里需要显式的使用 override
override def printName(){
println( "Emp printName() " +name)
//在子类中需要去调用父类的方法,使用 super
super. printName()
sayHi()
}
def sayhello()
}
二、最佳实践
类型检查和转换的最大价值在于:可以判断传入对象的类型,然后转成对应的子类对象,进行相关操作,这里也体现出多态的特点。【案例演示】
这里假如有一个 person 并拥有两个子类,分别是 emp 与 student,此时如果讲她们写成代码并看一下她们的使用价值。
package com.atguigu.chaptero7.myextends
object Typeconvertcase {
def main( args: Array[string]): unit = {
val stu = new student400
val emp = new Emp400
test(stu) //
test(emp)
}
//写了一个参数多态代码
//因为在 oop 中一个父类的引用可以接收所有子类的引用,多态(参数多态)
def test(p: Person400) : unit = {(这样写的一个 person 就意味着她的子类对象包括她自己都可以传进来)
这里的要求是判断到底是哪一个子类之后调用相应的方法。
//使用 scale 中类型检查和转换
if (p.isinstanceof [ Emp400]) { //判断
// p.asInstanceof [Emp400],对 p 的类型没有任何变化,而是返回的是 Emp400
p.asInstanceOf [ Emp400].showInfo()
}else if (p.isInstanceof[student400]) {
p.asInstanceof [student400].cryo()
}else {
println("转换失败")
}
class Person400 {
def printName() : unit = {
println( ""Person400 printName" )
}
def sayok(): unit = {
println("Person400 sayok")
}
}
class student400 extends Person400 {
val stuid = 100
overridedefprintName(:unit={
println( "student400printName")
}
def cry(: unit .= {
println(”学生的id=” + this.stuid)
}
}
class Emp400 extends Person400 {
val empId = 800
override def printName() : unit = {
println( "Emp400 printName" )
}
def showInfo() : unit = {
println(”雇员的id=” + this.empid}
}
