Scala Types 1
在 Scala 中所有值都有一种对应的类型
单例类型
形式:
value.type,返回类型value/null场景1:链式API调用时的类型指定
class Super {
def m1(t: Int) = {println(t); this}
def m2(t: Int) = {println(t); this}
}
// 正常打印
new Super().m1(1).m2(2) class Child extends Super {
def c1(t: Int) = {println(t); this}
} // 异常 value c1 is not a member of Super
new Child().m1(1).c1(2)
由于 Scala 会将
this推断为当前类(即Super),因此无法完成链式调用class Super {
// 指定返回类型为调用方的 this
def m1(t: Int): this.type = {println(t); this}
def m2(t: Int): this.type = {println(t); this}
} class Child extends Super {
def c1(t: Int) = {println(t); this}
} // 成功打印
new Child().m1(1).c1(2)
场景2:方法中使用
object实例作为参数object Foo
class Child extends Super {
def c1(obj: Foo.type) = {
if (obj == Foo) println("foo")
this
}
}
Note:不可定义为 def c1(obj: Foo),因为 Foo 为单例对象,而不是类型
类型投影
形式:
Outer#Inner场景:内部类使用时避免类型约束
class Outer {
private val inners = ArrayBuffer[Inner]() class Inner (val arg1: Int) {
val l = ArrayBuffer[Inner]()
} def add(a: Int) = {
val t = new Inner(a)
inners += t
t
}
} val a = new Outer
val b = new Outer val a1 = a.add(1)
val b1 = b.add(1)
a1.l += b1 // error: type mismatch;
只需要在定义内部类时指定类型投影即可解决
// 表示适用于任何 Outer 类的 Inner 类
val l = ArrayBuffer[Outer#Inner]()
如果将上述例子改用
List来实现,并不会报错,计算结果也会自动进行类型投射
路径
路径中除最后一部分外,都必须是稳定状态的,如包名、
object、val、this/super/super[S]...不能包含
var类型var t = new Outer()
//...其他操作
val i = new t.Inner // 由于 t 可能会变更,编译器无法确定其含义
a.b.c.T 内部被翻译成类型投射 a.b.c.type#T
类型别名
形式:
type SomeAliasName必须定义在
class或object内部好处: 在引用类型时可以更加简洁
class Book {
import scala.collection.mutable._
// 为该类型取一个别名
type Index = HashMap[String, Int] // 使用时不在需要重复的定义复杂的数据类型
val map: Index = new Index()
} new Book().map // scala.collection.mutable.HashMap[String,Int]
结构类型
为抽象方法、字段、类型的定义某种规范
def appendLines(target: { def append(str: String): Any },
lines: Iterable[String]) {
for (l <- lines) {
// 此次 Scala 使用反射调用该方法
target.append(l);
target.append("\n")
}
}
该方法第一个参数
target即结构类型,表示使用任何包含该append方法的实例作为参数传入。由于反射的代价较大,不到万不得已不建议使用,如,有通用行为(
append),却无法共享trait
组合类型 / 交集类型
形式:
T1 with T2 with T3 ...当需要提供多个特质时使用,即用于约束类型
val image = new ArrayBuffer[java.awt.Shape with java.io.Serializable]
val rect = new Rectangle(5, 10, 20, 30)
image += rect // 正确,Rectangle 可序列化
image += new Area(rect) // 错误 Area 不可序列化
组合类型中也可使用结构类型
Shape with Serializable { def contains(p: Point): Boolean }
中缀类型
其实只是一种语法写法,如
String Map Int可代替Map[String, Int]可参考数学运算中的表达方式
type x[A, B] = (String, Int)
// 即可使用 String x Int 来表示 (String, Int)
一般中缀类型操作符都是左关联的,除了前面提到的
:操作符,这个是右关联的,比如List的操作
中缀类型名称可以是任意操作符,除了
*,避免与类型定义冲突
Scala Types 1的更多相关文章
- Scala: Types of a higher kind
One of the more powerful features Scala has is the ability to generically abstract across things tha ...
- Scala Types 2
存在类型 形式: forSome { type ... } 或 forSome { val ... } 主要为了兼容 Java 的通配符 示例 Array[_] // 等价于 Array[T] for ...
- Beginning Scala study note(8) Scala Type System
1. Unified Type System Scala has a unified type system, enclosed by the type Any at the top of the h ...
- scala速成记录1
选择 Learning Scala这本书,两百多页,足够薄. 安装 http://www.scala-lang.org/ 下载Binary的版本.bin里边有所有操作系统下运行的可以运行的交互式s ...
- geotrellis使用(十九)spray-json框架介绍
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 spray-json简介 spray-json使用 ...
- Akka(33): Http:Marshalling,to Json
Akka-http是一项系统集成工具.这主要依赖系统之间的数据交换功能.因为程序内数据表达形式与网上传输的数据格式是不相同的,所以需要对程序高级结构化的数据进行转换(marshalling or se ...
- 【原创】大叔问题定位分享(11)Spark中对大表子查询加limit为什么会报Broadcast超时错误
当两个表需要join时,如果一个是大表,一个是小表,正常的map-reduce流程需要shuffle,这会导致大表数据在节点间网络传输,常见的优化方式是将小表读到内存中并广播到大表处理,避免shuff ...
- Spark SQL 函数全集
org.apache.spark.sql.functions是一个Object,提供了约两百多个函数. 大部分函数与Hive的差不多. 除UDF函数,均可在spark-sql中直接使用. 经过impo ...
- org.apache.spark.sql.functions汇总
测试数据: id,name,age,comment,date 1,lyy,28,"aaa bbb",20180102020325 scala> var data = spar ...
随机推荐
- Unity3D协程(转)
这篇文章转自:http://blog.csdn.net/huang9012/article/details/38492937 协程介绍 在Unity中,协程(Coroutines)的形式是我最喜欢的功 ...
- MySQL使用alter修改表的结构
SQL语句 DLL 数据定义语言 create,drop DML 数据操纵语言 insert,delete,select,upda ...
- python的multitask模块安装
今天参考网络上的例子,编写基于python的网络程序,遇到下面的错误. No module named 'multitask' 但是multitask的模块却始终下载不了,在网上找到的CSDN下载链接 ...
- Linux(Centos7)安装Oracle11.2.0数据字典初始化,监听,网络,创建用户等部分配置
#创建数据字典和pl/sql包 @/u01/app/oracle/product/11.2.0/db_1/rdbms/admin/catalog.sql; @/u01/app/oracle/produ ...
- node中glob模块总结
参考文章: githup_glob node-glob学习 前言: 最近在学习webpack配置, 其中有一项glob配置入口文件, 来获取对应的文件名, 达到入口entry和output文 ...
- 性能测试基础---jmeter基础
·Jmeter的脚本构成: Jmeter的脚本是由很多不同的组件构成,在Jmeter中,组件可以分为以下几类: ·测试计划: 是默认存在的组件,所有的Jmeter的组件都是依赖于测试计划的. 在这个组 ...
- USACO Poker Hands
洛谷 P3078 [USACO13MAR]扑克牌型Poker Hands 题目传送门 JDOJ 2359: USACO 2013 Mar Silver 1.Poker Hands JDOJ传送门 题目 ...
- 【Excel】IF函数
判断条件: 一版判断:1>2大于 1<2小于 1=2等于 1<>2不等于 1>=2 1<=2 交集:AND() 并集:OR() 多条件:以后补
- java spring框架的定时任务
由于测试的原因,最近有接触java spring @Scheduled的定时任务,当时还以为配置起来表达式和crontab是完全一样的,没想到还有些许不一样. 在spring中,一个cron表达式至 ...
- contest3 CF994 div2 ooxxx? oooox? ooooo?
题意 div2 C (x)(o) 在一个平面上, 给一个水平的正方形和一个\(45^.斜\)的正方形 求是否相交(共点也算), 坐标正负\(100\)以内 div2 D (x)(o) \(A,B\)两 ...