一.本章要点

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

二.单例类型

  给定任何引用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中,可以更上一层,定义依赖于依赖其他类型的类型的类型。

十六.练习

Scala学习十八——高级类型的更多相关文章

  1. Scala学习十四——模式匹配和样例类

    一.本章要点 match表达式是更好的switch,不会有意外调入下一个分支 如果没有模式能够匹配,会抛出MatchError,可以用case _模式避免 模式可以包含一个随意定义的条件,称做守卫 你 ...

  2. Scala学习十——特质

    一.本章要点 类可以实现任意数量的特质 特质可以要求实现它们的类具备特定的字段,方法或超类 和Java接口不同,Scala特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...

  3. Scala学习笔记(1)-基本类型归纳

    1.小试牛刀 使用Scala自带的REPL shell(Read Evaluate Print Loop)学习和尝试Scala语言库,创建的变量在会话期间都是有效的. Ctrl+D可退出REPL sh ...

  4. Scala学习十五——注解

    一.本章要点 可以为类.方法.字段.局部变量.参数.表达式.类型参数以及各种类型定义添加注解 对于表达式和类型,注解跟在被注解的条目之后 注解的形式有@Annotation.@Annotation(v ...

  5. Python学习札记(十八) 高级特性4 生成器

    参考:生成器 Note 1.通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的,且容易造成空间浪费.所以,如果列表元素可以按照某种算法推算出来,那我们可以在循环的过程中 ...

  6. Scala学习十九——解析

    一.本章要点 文法定义中的二选一.拼接.选项和重复在Scala组合子解析器中对应|.~.opt和rep 对于RegexParsers而言,字符串字面量和正则表达式匹配的是词法单元 用^^来处理解析结果 ...

  7. Scala学习十六——XML处理

    一.本章要点 XML字面量<like>this</like>的类型为NodeSeq 可以在XML字面量中内嵌Scala代码 Node的child属性产出后代节点 Node的at ...

  8. Scala学习十二——高阶函数

    一.本章要点 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数 ...

  9. Swift5 语言指南(二十八) 高级运算符

    除了Basic Operators中描述的运算符之外,Swift还提供了几个执行更复杂值操作的高级运算符.这些包括C和Objective-C中您熟悉的所有按位和位移运算符. 与C中的算术运算符不同,S ...

随机推荐

  1. Mac 卸载Python3.6

    Mac 自带的 Python 已经能够满足我们的需要了,因此很多同学在安装完 Python 之后,又想要将其删除,或者称之为卸载. 对于删除 Python,我们首先要知道其具体都安装了什么,实际上,在 ...

  2. Maven 3.6.1 下载及安装配置

    Step1:Download You can download Maven3.6.1 from maven.apche.org , or from here. Step2:Unzip and add ...

  3. 安装vue模板时,选择webpack-simple还是Webpack?

    选用模板常用的是webpack与webpack-simple.webpack-simple是基于Webpack@2.1.0-beta.25进行配置的版本,而webpack模板则是基于Webpack ^ ...

  4. python包中__init__.py文件的作用

    python包中__init__.py文件的作用 __init__.py文件最常用的作用是标识一个文件夹是一个 python包. __init__.py文件的另一个作用是定义模糊导入时要导入的内容. ...

  5. 阿里云轻量应用服务器 配置mysql详解(转载)

    1.服务器规格 1.地域选择 考虑个人地址因素因此选择了华南. 2.选择应用镜像/系统镜像 这个应该看个人需求,因为我只是想用来放数据库的,所以就随便选了个WordPress. 选好之后购买就完事了, ...

  6. CCIE总结:路由器、交换机

    bbs.spoto.net/forum--.html -----雏鹰部落 GNS3安装 .安装的所有目录不能使用中文 ISO如何操作 securecrt如何使用建立会话:之前总是连不上的原因是没有选 ...

  7. ID3算法(MATLAB)

    ID3算法是一种贪心算法,用来构造决策树.ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续 ...

  8. Jmeter 逻辑控制器 之 交替控制器

    马上国庆节了,没有安排新版本的上线任务,所以最近自学时间比较充裕,决定把Jmeter好好学习学习,并把学习过程分享到博客中,今天呢,学习交替控制器. 一.认识交替控制器 如下,在线程组下面创建一个交替 ...

  9. 【ARM-LInux开发】如何运行wayland

    Running Wayland 原文:https://jan.newmarch.name/Wayland/RunningWayland/ skip table of contents Show tab ...

  10. 记录一次SignalR服务端实现过程

    前言:最近手上一个项目需要后端实时推送数据到前端,第一个想到的就是微软的SignalR,由于之前都是平时没事写的Demo,没有用到实际项目中,这次恰好用到了,因此记录下来整个实现过程(网上也有很多类似 ...