zoukankan      html  css  js  c++  java
  • Scala学习十八——高级类型

    一.本章要点

    • 单例类型可用于方法串接和带对象参数的方法  
    • 类型投影对所有外部类的对象都包含了其他内部类的实例
    • 类型别名给类型指定一个短小的名称
    • 结构类型等效于”鸭子类型“
    • 存在类型为泛型的通配参数提供了统一形式
    • 使用自身类型来表明某特质对混入它的类或对象的类型要求
    • ”蛋糕模式“用自身类型来实现依赖注入
    • 抽象类型必须在子类中具体化
    • 高等类型带有本身参数化类型的类型参数

    二.单例类型

      给定任何引用v,可以得到类型.type,可能的两个值:v和null。例:

    //通过this返回自身串接
    class Document{
    def setTitle(title:String)={...;this}
    def serAuthor(author:String)={...;this}
    ...
    }
    
    article.setTile("...").setAuthor("...")
    
    //有子类
    class Book extends Document{
    def addChapter(chapter:String)={...;this}
    }
    val book=new Book()
    book.setTile("...").addChapter("...")//setTitle返回类型推断为Document,没有addChapter方法
    //解决(需要this.type)
    def setTitle(title:String):this.type={...;this}

    三.类型投影

       

       像这样,嵌套类从属于包含它的外部对象,每个Metwork实例都有自己的Member类(是不同的,不能将成员相互添加),不想要这个约束可以是放在伴生对象。

       如果不是所有地方都使用”每个对象自己的内部类“,可以使用类型投影,Network#Member。。。

    四.路径

      定位一个类等的位置。路径的组成必须是”稳定的“,必须指定单个,有穷的范围,组成部分是(包,对象,val,[this、super、super[S]、C.this、C.super[S]])中的一种,路径组成部分不能是类。

      注:路径组成部分不能是类(嵌套的内部类型并不是单个类型);

        在内部,编译器将嵌套的表达式a.b.c.T翻译称类型投影a.b.c.type#T。。。      

    五.类型别名

      对于复杂类型,可以用type关键字创建一个简单的别名。例:

        

    class Book{
    import scala.collection.mutable._
    //可以直接用Book.Index而不是scala.collection.mutable.HashMap[String,(Int.Int)]
    type Index=HashMap[String,(Int,Int)]
    }

      注:类型别名必须被嵌套在类或对象中,不能呢个出现在Scala文件顶层(在REPL中可以,REPL中的内容都隐藏在一个顶层对象中)

    六.结构类型(类似于鸭子类型)

      指的是一组关于抽象方法,字段和类型规格说明(必须的)。

      

      任何具备append方法的类的实例调用appendLines方法,比定义一个特质更灵活(可能不能够总是将特质添加到类上),结构类型实际是Scala利用反射调用target.append(...),反射比常规方法调用开销大得多(对无法共享一个特质的类的共通行为才使用结构类型)。

    七.复合类型

      定义形式为T1 with T2 with T3...,其中T1,T2等都是类型,要想成为该复合类型的实例,必须满足每一个类型(称为交集类型)。

    八.中置类型

      中置类型是一个带有两个类型参数的类型,以”中置“表示,类型名称写在两个类型参数中间。,如String Map Int而不是Map[String,Int],又如type x(A,B)=(A,B)。。。

    九.存在类型

      存在类型是为了与Java的类型通配符兼容,在类型表达式后跟forSome{...},花括号包含了type和val声明,如:Array[T] forSome{type T<:JComponent}。。。

    十.Scala类型系统

    十一.自身类型

      通过this:类型=>限制这样的特质只能混入给定类型的子类当中。

    十二.依赖注入

      通过组件构建大型系统时,每个组件都有不同的实现,需要将组件的不同选择组装起来。

      组件之间存在某种依赖关系,在Scala中,通过特质和自身类型达到一个简单的依赖注入的效果。

      使用蛋糕模式,为每个服务都提供一个组件特质:

    十三.抽象类型

      类和特质可以定义在一个子类中被具体化的抽象模型,例:

       比较:

        如果类型是在类被实例化时给出,则使用类型参数。比如构造HashMap[String,Int];

        如果类型是在子类中给出的,则使用抽象类型。

    十四.家族多态

      对跟着一起变化的类型家族建模,同时共用代码,并保持线程安全。。。

    十五.高等类型

      泛型List依赖于类型T并产出一个特定的类型,像List这样的泛型叫类型构造器,在Scala中,可以更上一层,定义依赖于依赖其他类型的类型的类型。

    十六.练习

  • 相关阅读:
    二维几何前置知识
    点分治学习笔记
    $fhq-treap$学习笔记
    对拍使用方法
    2021.2.18-2021.5.18 三个月后端开发实习的学习路径
    蓝桥杯常考算法 + 知识点
    Linux
    Linux
    Intern Day112
    Linux上编译运行C/C++程序
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/11981966.html
Copyright © 2011-2022 走看看