单例类型初体验与在链式调用中的应用

参考文献

scala 深入浅出实战经典 . 王家林

http://www.wtoutiao.com/p/119t7hn.html

场景
单例类型初体验与在链式调用中的应用
实验

package com.scode.scala
/**
 * author: Ivy Peng
 * function: 模式匹配实战
 * date:2016/04/1 22:00
 * 
 * 单例类型:
 * 1、所有Scala对象包括单例对象都存在的一种类型
 * 2、对象的单例类型不同,但对象的类是相同的
 */
object Scala //声明一个单例对象

import scala.reflect.runtime.universe._
class Java1
class JVM
{
  def method1:this.type = 
  { 
    println("method1 invoked !")
    this
  }
}
class JVM_Language extends JVM
{
  def method2:this.type =
  { 
    println("method2 invoked !")
    this
  }
}

object Singleton_Type
{
  def main(args: Array[String]): Unit =
  {
    /*
     * 单例类型 与 类型: 类型比单例类型更抽象-对象的单例类型不同,但对象的类是相同的
     */
    println(Scala.getClass)
    
    //"typeOf方法会返回具体的类型而不是泛型擦除后的类型" :亲,怎么理解呢?后续进 一步考察
    println(typeOf[Scala.type])
    
    val java = new Java1
    println(typeOf[java.type]) 
    val java2 = new Java1
    println(typeOf[java2.type]) 
    
//    val x:java.type = java2 // 编译时异常 :java.type只有唯一的对象实例java,将java2赋值给java.type类型的变量会产生类型不匹配
    val content:java.type = java
    
    /*
     * java.type为Java1类的子类这一事实
     */
    println(typeOf[java.type]<:<typeOf[Java1])
    
    //应用:链式调用 - this关键字的动态特性,得以完成链式调用
    val jvm = new JVM_Language
    jvm.method1.method2
  }
} 

结果

class com.scode.scala.Scala$
com.scode.scala.Scala.type
java.type
java2.type
true
method1 invoked !
method2 invoked !

你可能感兴趣的:(单例类型初体验与在链式调用中的应用)