0502.值類型(Value Types)

值類型(Value Types)

Scala 一切都是物件!在此老魚不將其 Type 翻作“型別”或叫“型態”, 是因為它們在 Scala 中全都是以“實例(Instance)”及其異變實例形式存在, 而非像 Java 是同時擁有非 OO 的基本型別及其外覆類別(Primitive Types and Wrapper Classes)與靜態(Static)等複雜化風格. - WisdomFish.ORG




相較於 Java


相較於 Java, Scala 不存在原始型別(Primitive Types), 是一個純物件導向(OO)語言, 但效能並不因此而劣於 Java, 其主要的特性如下:
  1. 除了 String 類型以別名(Alias)方式使用原生 JVM (java.lang.String) 或 .NET CLR 平台 String 之外, 其它的型別, 都以 Scala._ 套件中載明對映 Java 的 API 關係, 
  2. 優點表現在與 Java 互操作性時不會帶來因類型轉換所造成的性能耗損.
  3. 值類型 APIs 位於 package scala._ 之中.
  4. 繼承來自 scala.AnyVal
    1. 數值類型(Numeric value types)
      1. 子界/附屬域 類型(Subrange types): Byte, Short, Char
      2. 整數 類型(Integer types): Int(Integer), Long
      3. 浮點數類型(Floating point types): Float, Double
    2. Boolean
    3. BigInt == java.math.BigInteger
    4. Unit :相當於 Java 的 Void class, 只有一對小括號的表示符 ( )


類型推論


Scala 不是動態語言, 而是一個嚴肅的靜態語言, 為了高效能需要明確的進行值類型分類, 你可以在下列多個例子中看到結果, Scala 預設採用 類型推論(Type Inference) 或稱推演/推斷 來主動協助你判定的值類型, 但您仍可明確地顯式宣告值類型. 


scala> 1
res2: Int = 1

1 以 scala.Int 實例存在, 若無法滿足 Int 方法調用時, 會自行調用 intWrapper() 轉型為 scala.runtime.RichInt 來調用更多方法.

scala> 1L
res9: Long = 1


scala> 1.0F
res8: Float = 1.0

scala> 1.0f
res8: Float = 1.0

scala> 1.0
res5: Double = 1.0

scala> 1.
res5: Double = 1.0

scala> .4
res30: Double = 0.4


scala> 's'
res7: Char = s

scala> '\u0041'
res32: Char = A


scala> true
res24: Boolean = true

scala> false
res25: Boolean = false

           scala> val x: BigInt = 20
           x: BigInt = 20



顯式宣告


Scala 相同其它靜態語言, 由你親自來為其指定值類型, 一但被顯式的指明, 給予的值相對也不可超出指定值類型的值範圍.

scala> val fish: Short = 1
fish: Short = 1

scala> val fish: Byte = 1
fish: Byte = 1

scala> val fish: Byte = 1.0
<console>:4: error: type mismatch;
 found   : Double(1.0)
 required: Byte
       val fish: Byte = 1.0
                        ^




BigDecimal & BigInt


Scala 對於大浮點數與大整數, 採以和 JVM / .NET CLR 掛勾方式操作, 但一般開發者可以不須了解其內部運作, 僅依你原本方式來直接使用這二者即可.
  1. 位於 scala 主套件內, 不須 import 即可調用.



Package scala.runtime._





值類型架構圖





Type 轉型

Comments