1

类型系统

引用类型

  • AnyRef的子类

  • 使用new构造对象

  • 当存在默认构造函数,可以略去括号

  • AnyRef等价于java.lang.Object

  • 可以将null赋值给Reference Type

值类型

  • AnyVal的子类

  • Char, Byte, Short, Int, Long, Float, Double, Unit, Boolean

  • 不能使用new构造实例,而使用Literal Values构造实例

  • 编译器将其映射为Java原生类型,以便提升性能

  • 不能将null赋值给Int的变量

Int为例,其定义类似于:

final abstract class Int private extends AnyVal
  • final表示不能被子类化

  • abstract表示不能被实例化

  • private表示主构造函数私有化,进一步保证不能被实例化

  • extends AnyVal表示只能使用字面值构造实例

内置字面值

Unit()

Unit类型在JVM中对应于Javavoid

final abstract class Unit private extends AnyVal

()是其唯一的实例。

classOf[Unit]   // Class[Unit] = void
().getClass     // Class[Unit] = void

classTag[Unit]  // scala.reflect.ClassTag[Unit] = Unit
classTag[Unit].runtimeClass // Class[_] = void

具有返回值类型为Unit的函数常常被称为「过程」(Procedure)。

def update(i: Int, value: Char): Unit = {
  ...
}

常常忽略Unit =Scala默认推演为Unit。上例等价于

def update(i: Int, value: Char) {
  ...
}

返回值为Unit的函数,代表了「副作用」语义;从某种意义上讲,「过程」是一种反函数式的思维。

Nullnull

Null是所有AnyRef的子类型,存在唯一的实例null。不能将null赋予「值类型」,例如Int, Boolean等。

val num: Int = null  // Compile Error

符号

'1th
'2th

如果符号中有空格,可以是使用Symbol::apply直接构造

Symbol("Programming Scala")

元组

(1, "two")等价于Tuple2(1, "twp"),或者Tuple2[Int, String](1, "two")

val t1 = (1, "two")
val t1: (Int,String) = (1, "two")
val t2: Tuple2[Int,String] = (1, "two")

函数值

(i: Int, s: String) => s+i是类型为Function2[Int, String, String]的一个字面值。

字面值的类型定义常常用于类型声明,如下三个变量定义是相同的:

val f1: (Int, String) => String = (i, s) => s + i
val f2 = (i: Int, s: String) => s + i
val f3: Function2[Int, String, String] = (i, s) => s+ i

自定义自面值

Map

val capital = Map("US" -> "Washington", "France" -> "Paris")

"US" -> "Washington"构造了一个类型为Tuple2[String, String]的二元组:("US", "Washington")

package scala

object Predef {
  implicit final class ArrowAssoc[A](private val self: A) extends AnyVal {
    def ->[B](y: B) = (self, y)
  }
}

Regex

val regex = "([0-9]+) ([a-z]+)".r

需要注意的是,r并非java.lang.String的方法,Scala拥有一套完备的机制增强既有类库的能力。


horance
255 声望29 粉丝

刘光聪,程序员,敏捷教练,开源软件爱好者,具有多年大型遗留系统的重构经验,对OO,FP,DSL等领域具有浓厚的兴趣。


引用和评论

0 条评论