摘要 &quot。在Scala中,所有的值都有類型,包括數值和函數。

java的除了原始類型的所有類都有一個默認的父類Object,那麼scala的統一父類是什麼呢?這個是有人在羣裏問浪尖的一個問題,今天浪尖就給大家講解一下Scala類型層次結構

在Scala中,所有的值都有類型,包括數值和函數。下圖闡述了類型層次結構的一個子集。

1. Scala類型層次結構

Any 是所有類型的超類型,也稱爲頂級類 型。它定義了一些通用的方法如 equals hashCode toString Any 有兩個直接子類: AnyVal AnyRef

AnyVal 代表值類型。有9個預定義的非空的值類型分別是: DoubleFloatLongIntShortByteCharUnitBooleanUnit 是不帶任何意義的值類型,它僅有一個實例可以像這樣聲明: () 。所有的函數必須有返回,所以說有時候 Unit 也是有用的返回類型。

AnyRef 代表引用類型。所有非值類型都被定義爲引用類型。在Scala中,每個用戶自定義的類型都是 AnyRef 的子類型。如果Scala被應用在Java的運行環境中, AnyRef 相當於 java.lang.Object

這裏有一個例子,說明了字符串、整型、布爾值和函數都是對象,這一點和其他對象一樣:

<span>val list: List[Any] = List(</span>

<span> &quot;a string&quot;,</span>

<span> 732,</span>

<span> 'c',</span>

<span> true,</span>

<span> () =&gt; &quot;an anonymous function returning a string&quot;</span>

<span>)</span>

<span><br /></span>

<span>list.foreach(element =&gt; println(element))</span>

這裏定義了一個類型 List<Any> 的變量 list 。這個列表裏由多種類型進行初始化,但是它們都是 scala.Any 的實例,所以可以把它們加入到列表中。

下面是程序的輸出:

a string732ctrue<function>

2. 類型轉換

值類型可以按照下面的方向進行轉換:

例如:

<span>val x: Long = 987654321</span>

<span>val y: Float = x</span>

<span><br /></span>

<span>val face: Char = '☺'</span>

<span>val number: Int = face</span>

轉換是單向,下面這樣寫將不會通過編譯。

<span>val x: Long = 987654321</span>

<span>val y: Float = x</span>

<span>val z: Long = y</span>

你可以將一個類型轉換爲子類型,這點將在後面的文章介紹。

Nothing和Null

Nothing 是所有類型的子類型,也稱爲底部類型。沒有一個值是 Nothing 類型的。它的用途之一是給出非正常終止的信號,如拋出異常、程序退出或者一個無限循環(可以理解爲它是一個不對值進行定義的表達式的類型,或者是一個不能正常返回的方法)。

Null 是所有引用類型的子類型(即 AnyRef 的任意子類型)。它有一個單例值由關鍵字 null 所定義。 Null 主要是使得Scala滿足和其他JVM語言的互操作性,但是幾乎不應該在Scala代碼中使用。我們將在後面的章節中介紹 null 的替代方案。

推薦閱讀:

簡單理解scala的閉包

Scala語法基礎之隱式轉換

一文詳解scala泛型及類型限定

相關文章