关闭

深入理解Scala中的类型系统

标签: Scala结构类型
8999人阅读 评论(0) 收藏 举报
分类:

核心内容:
1、Scala中定义类型的两种方式
2、Scala中的路径依赖
3、Scala中的自身类型以及自身类型的限定
4、Scala中的依赖注入
5、Scala中的链式风格调用—-Type机制的用法
6、Scala中的复合数据类型
7、Scala中的抽象类型
8、Scala中的类型参数
9、Scala中的类型约束
10、Scala中的型变、逆变、协变
11、Scala中的结构类型


1、Scala中定义类型的两种方式

在Scala当中可以用以下两种方式定义类型:
①定义类、特质或对象
②直接用type关键字定义类型
在Scala当中,标注类型的时候可以直接用类和特质的名字来引用其类型,要引用对象的类型,需要用对象的type成员来引用其类型。


这里写图片描述


2、Scala中的路径依赖

①在Scala当中,对象的路径依赖不同,则其类型也不相同,路径依赖不同,导致类型不同。
②路径不是类型,而是类似某种位置。


这里写图片描述


3、Scala中的自身类型以及自身类型的限定

①每个类本身都有一个this指针,通过this指针可以引用自身的实例;在自身类型当中,self不是关键字,是this的别名,具有更强的可读性。
②在Scala当中,可以在类中、特质中、Object中对自身类型this进行限制约束,通过自身类型限制的方式,可以很好的限制我们的类型以及行为。

这里写图片描述
1、限定创建S2对象时,必须混入S1这个特质
2、S2的子类也必须混入S1 这个特质


这里写图片描述


4、Scala中的依赖注入

①Scala中的依赖注入是通过自身类型限制的方式来完成的,表现为自身类型限定后,可以使用携带类中的属性和方法.
②Scala中的依赖注入可以看做是Scala当中混入特质的第三种方式.
③通过Scala中的依赖注入,可以使现有的类使用携带类中的属性与方法,通过隐式转换机制可以完成同样的功能。


实例1:
这里写图片描述
实例2:
这里写图片描述
从上面的程序可以看出隐式转换功能的强大。


5、Scala中的链式风格调用—-Type机制的用法

①在Scala当中,我们之所以能做到链式风格的编程,是因为我们用了type机制,即所谓的单例类型的方式,将一些方法调用串联起来.
②在Scala当中,任何类对象都有一个type属性,这种type属性可能返回的是类或者为对象或者为空值。
③this.type是Scala提供的一种机制,其指向当前对象的类型。


这里写图片描述


6、Scala中的复合数据类型

①Scala中的复合数据类型就是通过组合其它的类型来构造的具体的类型,这种组合而成的新类型称为复合数据类型.
这里写图片描述
A类型是一个复合的数据类型,既是B又是C又是D的子类型,即要求A既具有
B、又具有C、又具有D的功能。Java中的语法解读不同于此。


这里写图片描述


7、Scala中的抽象类型

①在Scala当中使用type关键字定义抽象类型,所谓抽象类型就是没有指明具体类型的类型 .
②在Scala当中,因为有的时候类型参数语法显得过于复杂,所以能用抽象类型的时候尽量用抽象类型.


示例程序1:
这里写图片描述
示例程序2:
这里写图片描述


8、Scala中的类型参数

①在Scala当中,类型参数是在普通参数之前用中括号[]来定义的,然后普通参数就可以用类型参数作为参数的类型,类型参数定义的简单方法:
这里写图片描述
②类型参数很像方法参数,只是它们是在编译时做的参数化.


这里写图片描述


9、Scala中的类型约束

①在Scala当中,类型变量的限定(约束)分为两种类型:类型变量的上界与类型变量的下界。通过类型变量的限定,我们可以方便的表达出类型变量具有某些需要的特征和方法.
②类型变量的上界定义方式:
这里写图片描述
类型变量的下界定义方式:
这里写图片描述
③在Scala当中,所有类型的最大上界是Any,最大下界是Nothing.
因为在Scala当中所有的类型都继承自Any,而所有的类型都被Nothing继承.


这里写图片描述


10、Scala中的型变、逆变和协变

①型变指的是像T[A]这样的高阶类型的类型参数可以改变或变化的能力,型变有三种形式:不变(Invariance)、协变(Covariance)、逆变(Contravariance).协变是指把类型参数替换为其父类的能力,即妥协的变化.逆变是指把类型参数替换为其子类的能力,及逆天的变化.
②如果一个类型参数支持协变的或者逆变的,则称这个类型参数为Variance(可变的),否则称之为不可变的.
③可变的泛型类型并不会被子类继承,若父类声明为可变的,子类如果想保持可变类型,仍需要再次声明为可变类型.
④对于函数而言,函数的参数类型是逆变的或者不变的,而函数的返回值类型是协变的或不变的 .
⑤一般来说,当在类方法里碰到协变和逆变的故障时,通常的解决方法是引入一个新的类型参数,即在方法签名里用新引入的类型参数.


这里写图片描述


11、Scala中的结构类型

①结构类型是指一组关于抽象的方法或字段或类型的规格的说明,这些抽象的方法或字段或类型是我们传进来的参数必须具备的:即传进来的参数或对象必须具备相应的抽象方法或字段或类型。
②在Scala的结构类型当中,我们并不关心传进来的对象的类型,我们对传进来的参数或对象只有一个要求:即传进来的参数或对象具有 某种行为。


这里写图片描述


如有问题,欢迎大家留言指正!

3
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

深入理解Scala中的类型系统

核心内容:  1、Scala中定义类型的两种方式  2、Scala中的路径依赖  3、Scala中的自身类型以及自身类型的限定  4、Scala中的依赖注入  5、Scala中的链式风格调用...
  • u013063153
  • u013063153
  • 2016-11-07 14:56
  • 929

Scala的数据类型和基础语法

 lang 2.1.     和Java的异同 2.1.1.  语法 Java++:增加的语法 Java--:删减的语法 纯OO ...
  • Rocky_wangjialin
  • Rocky_wangjialin
  • 2014-10-16 11:48
  • 3047

scala数据类型

和java的数据类型类似,scala中的数据类型都是以大写开头。不仅仅数据类型和Java类型,就连数据类型操作,都差不多,最大的区别就是写法的不同,但是对于有Java基础的同学,应该会在看到一段表达式...
  • oh_Mourinho
  • oh_Mourinho
  • 2016-10-10 09:54
  • 465

Scala(二)之“数值”

Scala中所有的数值都是对象,包括Byte、Char、Double、Float、Int、Long和Shart。与被称为“非数值类型”的Unit和Boolean一样,这些数值类型都继承扩展自AnyVa...
  • GnahzNib
  • GnahzNib
  • 2016-08-29 09:11
  • 1848

scala中常用的数据类型

集合类基本上都有mutable和immutable两种类型,其中immutable的类型在定义好之后就不能再改变,既不能改变集合中的值也不能改变集合的长短 Array数组类型: 使用...
  • yhb315279058
  • yhb315279058
  • 2015-12-09 21:54
  • 561

深入理解Scala中的类型系统

核心内容:  1、Scala中定义类型的两种方式  2、Scala中的路径依赖  3、Scala中的自身类型以及自身类型的限定  4、Scala中的依赖注入  5、Scala中的链式风格调用...
  • u013063153
  • u013063153
  • 2016-11-07 14:56
  • 929

【Scala类型系统】类型参数化和变化型注解

引言类型参数化(Parameterized Types)可以用来编写泛型类和特质,比如定义Set[T],这使得我们可以创建诸如Set[String]的类型。而变化型注解(Variance Annota...
  • JasonDing1354
  • JasonDing1354
  • 2016-02-27 21:33
  • 1695

深入理解Scala中的类型系统

核心内容:  1、Scala中定义类型的两种方式  2、Scala中的路径依赖  3、Scala中的自身类型以及自身类型的限定  4、Scala中的依赖注入  5、Scala中的链式风格调用—-Typ...
  • u013063153
  • u013063153
  • 2016-12-05 15:16
  • 119

深入理解Scala中的集合

2016年10月9日08:41:29 1、简述声明List的3种方式 1>常见的声明方式:var list 2>::(2个冒号)+Nil的方式:val data2 = 10::(20::30::...
  • a2011480169
  • a2011480169
  • 2016-12-01 14:23
  • 2092

Scala:日期和时间

package com.yh.hbaseusers import java.time.LocalDate /** * Created by silentwolf on 2016/6/30. ...
  • silentwolfyh
  • silentwolfyh
  • 2016-06-30 17:28
  • 4218
    个人资料
    • 访问:618303次
    • 积分:8981
    • 等级:
    • 排名:第2444名
    • 原创:332篇
    • 转载:87篇
    • 译文:0篇
    • 评论:111条
    最新评论