定义 特质能够要求混入它的类扩展自还有一个类型,可是当使用自身类型(self type)的声明来定义特质时(this: ClassName =>).这种特质仅仅能被混入给定类型的子类其中. 如果尝试将该特质混入不符合自身类型所要求的类时,就会报错. 从技术角度上看.自身类型是在类中提到this时,对于this的如果性类型.从有用角度上看,自身类型指定了对于特质能够混入的详细类的需求.如果你的特质仅用于混入还有一个或几个特质.那么能够指定那些如果性的特质. 自身类型在依赖注入的应用 在通过组件构建…
One of the more powerful features Scala has is the ability to generically abstract across things that take type parameters. This feature is known as Higher Kinded Types (HKT). This feature allows us to write a library that works with a much wider arr…
首先我们从最基本的泛型来看: 现在我们对上面泛型中的类型参数再进一步,也是个泛型会如何呢? 可以看到,java中不支持类型参数也是泛型类型的情况,而scala支持.这是一个很重要的区别,scala在类型系统上要比java强大.我们现在简单对类型归纳一下,可以分为两类: 1)特定类型(proper type) 比如 Int, String, List[Int], List2[List] 等类型 2) 泛型类型:用于构造特定类型(proper type)的类型 比如 List, List2 等类型…
和c里的type有点像. scala里的类型,除了在定义class,trait,object时会产生类型,还可以通过type关键字来声明类型. type相当于声明一个类型别名: scala> type S = String defined type alias S http://hongjiang.info/scala-type-system-type-keyword/…
当我们需要定义一些对应高阶类型进行相互类型转换的操作函数时,我们发现scala语言并不提供能定义这种函数的支持.举例来说:如果我们希望定义一个函数把对于任何T值的Option[T]转换成List[T]的话,我们可能这样定义: def toList[T](opt: Option[T]): List[T] = opt.toList //> toList: [T](opt: Option[T])List[T] val hOptFun = toList _ //> hOptFun : Option[N…
http://docs.scala-lang.org/tour/lower-type-bounds.html中有一段代码 trait Node[+B] { def prepend(elem: B): Unit } case class ListNode[+B](h: B, t: Node[B]) extends Node[B] { def prepend(elem: B) = ListNode[B](elem, this) def head: B = h def tail = t } case…
高级类类型就是使用其他类型构造成为一个新的类型,因此也称为 类型构造器(type constructors).它的语法和高阶函数(higher-order functions)相似,高阶函数就是将其它函数作为参数的函数:高级类类型则是将构造类类型作为参数类型.一个高级类类型可以有一个或者多个类型作为参数.在Scala中,你可以使用type关键字声明,如下: 这里定义了一个高级类类型Callback,该类型接收一个类型 T,并构造一个新的类型Function1.类型Callback不是一个完整的类…
recursive value x$5 needs type的原因是使用了一个类型不确定的变量,例如 val (id, name) = (id, getName(id)) 其中id是个变量,其值还不确定, 就在getName(id)方法上使用..例子不合理,但是一般这个报错就是代码写错了.…
// Stream:Stream is lazy List; // Stream惰性求值指它只确定第一个值,后面的值用到再求值,这样可以防止数据过大全部加载导致内存溢出 // 将Range转化成Stream val stream = (1 to 1000).toStream println(stream) // Stream(1, ?) println(stream.head) println(stream.tail) // Stream(2, ?)…
Scala 作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之外,还有语法层面的,比如 underscore(下划线)就会出现在多种场合,令初学者相当疑惑,今天就来总结下 Scala 中下划线的用法. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 1.存在性类型:Existe…