类型系统

引用类型
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中对应于Java的void。
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的函数,代表了「副作用」语义;从某种意义上讲,「过程」是一种反函数式的思维。
Null与null
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拥有一套完备的机制增强既有类库的能力。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。