AnyRef
的子類java
使用new
構造對象api
當存在默認構造函數,能夠略去括號app
AnyRef
等價於java.lang.Object
函數
能夠將null
賦值給Reference Type
性能
AnyVal
的子類spa
Char, Byte, Short, Int, Long, Float, Double, Unit, Boolean
scala
不能使用new
構造實例,而使用Literal Values
構造實例code
編譯器將其映射爲Java
原生類型,以便提高性能對象
不能將null
賦值給Int
的變量ci
以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
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) } }
val regex = "([0-9]+) ([a-z]+)".r
須要注意的是,r
並不是java.lang.String
的方法,Scala
擁有一套完備的機制加強既有類庫的能力。