zoukankan      html  css  js  c++  java
  • Scala 深入浅出实战经典 第51讲:Scala中链式调用风格的实现代码实战及其在Spark中应用

    王家林亲授《DT大数据梦工厂》大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
    百度云盘:http://pan.baidu.com/s/1c0noOt6
    腾讯微云:http://url.cn/TnGbdC
    360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2
    土豆:http://www.tudou.com/programs/view/5uuKOP38d6s/
    优酷:http://v.youku.com/v_show/id_XMTI4MzMzMjM3Ng==.html?from=s1.8-1-1.2
    爱奇艺:http://www.iqiyi.com/w_19rrx5djod.html#vfrm=2-3-0-1
    腾讯视频: http://v.qq.com/boke/page/q/0/a/q01598mqrna.html
    技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群

    DT大数据梦工厂① :462923555
    DT大数据梦工厂②:437123764
    DT大数据梦工厂③ :418110145

    微信公众账号: DT_Spark
    王家林老师微信号: 18610086859
    王家林老师QQ: 1740415547
    王家林老师邮箱: 18610086859@126.com

    本视频由王家林老师, 亲自讲解, 完全通过代码实战把您带人大数据的时代.

    package com.parllay.scala.type_parameterizitor
    
    /**
    * Created by richard on 15-8-5.
    * 第51讲:Scala中链式调用风格的实现代码实战及其在Spark中应用
    */
    object Singleton_Type {
    /**
    
    scala> object A
    
    scala> A.getClass
    res2: Class[_ <: A.type] = class A$
    
    scala> typeOf[A.type]
    res0: reflect.runtime.universe.Type = A.type
    对于这种单例,它的类型与它的类不同,要用 A.type 来表示。
    
    这有点怪,通常我们不会用它,比如下面的方式都多此一举:
    
    scala> val a : A.type = A
    
    scala> def foo() : A.type = A
    一方面因为scala有类型推导的功能,另一方面,因为单例是唯一的,
    A.type类型只有唯一的实例A(排除null),我需要的话直接用A就好了。
    
    不过我们讨论的话题重点是 singleton type,想象一下A是一个对象实例,
    是否对任何实例x都存在一个x.type这样的类型呢?
    
    scala> class A
    
    scala> val a = new A
    
    scala> typeOf[a.type]
    res0: reflect.runtime.universe.Type = a.type
    wow,真的存在。再用这个类型声明一个变量看看:
    
    scala> val x:a.type = a
    x: a.type = A@6738694b
    灵的,如果赋一个非a的实例呢?
    
    scala> val x:a.type = a2
    <console>:13: error: type mismatch;
    found : a2.type (with underlying type A)
    required: a.type
    
    scala> typeOf[a.type] == typeOf[A] // a.type 与 A 不是同一个类型
    res2: Boolean = false
    
    scala> typeOf[a.type] == typeOf[a2.type] // a.type 与 a2.type 也不同
    res1: Boolean = false
    
    scala> typeOf[a.type] <:< typeOf[A] // a.type 是 A 类型的子类型
    res5: Boolean = true
    看到了,a.type 与 a2.type 是不同的类型!a.type也是单例类型,
    它也只有唯一的实例: a (排除null)
    
    所有的对象实例都有一个x.type的单例类型,它只对应当前对象实例。
    这么做有什么意义呢?
    
    从这里看到一种情况,在“链式”调用风格下,有适用的场景:
    
    class A {def method1: A = this }
    class B extends A {def method2: B = this}
    
    val b = new B
    b.method2.method1 // 可以工作
    b.method1.method2 // 不行,提示:error: value method2 is not a member of A
    有些人很喜欢用 x.foo.bar 这样的方式连续的去操作,这种风格也成为”链式调用”风格,
    它要求方法返回的必须是当前对象类型,以便连贯的调用方法。不过上面,
    因为父类中声明的method1方法返回类型限制死了就是A类型(不写返回值类型,用类型推导也一样),
    导致子类对象调用完method1之后,类型已经变成了父类型,无法再调用子类型中的方法了。解决方法是:
    
    class A { def method1: this.type = this }
    class B extends A { def method2 : this.type = this }
    
    val b = new B
    b.method1.method2 // ok
    把返回类型都改为了 this.type 单例类型,就灵了。它利用了this关键字的动态特性来实现的,
    在执行b.method1 的时候,method1返回值类型this.type 被翻译成了B.this.type
    
    scala> b.method1
    res0: b.type = B@ca5bdb6
    这样不同的对象实例在执行该方法的时候,返回的类型也是不同的(都是当前实例的单例类型)。
    
    小结,单例类型是个特殊的类型,单例类型绑定(依赖)在某个对象实例上,每个对象实例都有它的单例类型。不过它的场景并不多见。
    */
    }
    

      

  • 相关阅读:
    Oracle 数据库连接很慢,服务器监听一直等待
    Maven 根据不同的环境使用不同的配置
    Maven 根据不同的包路径打出不同的Jar包
    Linux 安装Nginx并支持SSL
    Nginx OpenSSL创建自签证书实现HTTP转HTTPS
    Oracle 服务突然中断处理(检查状态、重启)
    请求转发和重定向
    PHP PDO的简单封装(使用命名空间方式)
    PHP PDO学习小结
    MYSQL预处理机制
  • 原文地址:https://www.cnblogs.com/czh-liyu/p/4711905.html
Copyright © 2011-2022 走看看