示例代码:
//Type与Class实战详解
/**
* 类型系统与类
*
* 无论java还是scala都是基于jvm虚拟机
* java1.5以前一个具体对象的类型和他的class是一一对应的,后来由于引入了泛型。
* 例如数组,数组里面有可能是字符串也可能是整数类型等等,
* 虚拟机本身并不关心泛型,或者类型系统,在虚拟机中泛型在编译和运行时是被擦除掉的。
* 在运行时是通过反射获取到的。
*/
import scala.reflect.runtime.universe._
class Spark
trait Hadoop
object Flink
class Java{
class Scala
}
object Type_Advanced {
def main(args: Array[String]): Unit = {
println(typeOf[Spark]) //com.dt.scala.bestpractice.Spark
println(classOf[Spark]) //Class[_<: Spark] //class com.dt.scala.bestpractice.Spark
val spark = new Spark
// println(spark.getClass == classOf[Spark])
println(classOf[Hadoop]) //interface com.dt.scala.bestpractice.Hadoop
println(typeOf[Hadoop]) //com.dt.scala.bestpractice.Hadoop
println(Flink.getClass) //class com.dt.scala.bestpractice.Flink$ object背后是有具体的类的
// println(classOf[Flink])//报错,没有找到Flink这个类
//classOf与getClass的区别:getClass其实获得的是当前类的子类, 直接classOf就是当前的类型
val java1 = new Java
val java2 = new Java
val scala1 = new java1.Scala
val scala2 = new java2.Scala
println(scala1.getClass) //class com.dt.scala.bestpractice.Java$Scala
println(scala2.getClass) //class com.dt.scala.bestpractice.Java$Scala
println(typeOf[java1.Scala] == typeOf[java2.Scala]) //false
println(typeOf[java1.Scala]) //java1.Scala
}
}