第78讲:Type与Class实战详解学习笔记
本讲主要讲解scala中的type与class的区别
由于在scala中非常强调泛型或者说类型系统
Java和scala是基于jvm的,
java1.5以前具体对象的类型与class一一对应
后来引入泛型,如字符串数组或整数数组,都是数组
但其实类型是不一样的,在虚拟机内部,并不关心泛型或类型系统
对泛型支持是基于运行时角度考虑的,在虚拟机中泛型被编译运行时是被擦除的,
在运行时泛型是通过反射方式获取,在scala中类型系统非常强大
在scala中有一个scala.reflect.runtime.universe
与class比,type更具体,任何数据都有类型,
class其实是一种数据结构和基于该数据结构的一种抽象,
例如array,或file有自己的成员和方法,更宏观。
type本身更具体 。
实战代码:
import scala.reflect.runtime.universe._
class Spark
trait Hadoop
object Flink
class Java {
class Scala
//内部类
}
objdect Type_Advanced {
def main(args:Array[String]){
println(typeOf[Spark])
println(classOf[Spark])
val spark = new Spark
println(classOf[Spark])
//Class[_ <: Spark]表明子类
//println(spark.getClass == classOf[Spark]) 报错
println(classOf[Hadoop])
println(typeOf[Hadoop])
println(Flink.getClass)
//运行结果打印class com.dt.scala.bestpractice.Flink$
//生动地告诉我们object背后是有具体的class的
//println(classOf[Flink]) 报没有找到Flink类,
//classOf与getClass基本是没有区别的,
//但getClass是获得具体的类的子类,
//classOf是类本身,
val java1 = new Java
val java2 = new Java
val scala1 = new java1.Scala
val scala1 = new java2.Scala
println(scala1.getClass)
println(scala2.getClass)
//上面两例打印结果都是:Java$Scala
println(typeOf[java1.Scala] == typeOf[java2.Scala])
println(typeOf[java1.Scala])
//打印结果:java1.Scala
println(typeOf[java2.Scala])
//打印结果:java2.Scala
//typeOf[java1.Scala] 与 typeOf[java2.Scala]结果不一样,
//而且与scala1.getClass和scala2.getClass的结果都不一样。
//从打印结果可以看出typeOf返回具体信息,而getClass返回更高层的信息
println(classOf[List[Int]] == classOf[List[String]])
println(typeOf[List[Int]] == typeOf[List[String]])
//泛型List返回同样是classOf更高层一些,typeOf更具体一些。
}
}
以上代码运行结果:
以上内容是从王家林老师DT大数据课程第78讲的学习笔记。
DT大数据微信公众账号:DT_Spark
王家林老师QQ:1740415547
王家林老师微信号:18610086859
scala第78讲视频观看链接:
http://yun.baidu.com/s/1ntmr88L
我的百度网盘共享的DT大数据梦工厂王家林老师第1-79讲的视频内容:http://pan.baidu.com/s/1qWK9CMo