您好,登錄后才能下訂單哦!
本篇內容主要講解“scala的類型推斷是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“scala的類型推斷是什么”吧!
Scala 編譯器通常可以推斷出表達式的類型,因此你不必顯式地聲明它。
val businessName = "Montreux Jazz Café"
編譯器可以發現 businessName
是 String 類型。它的工作原理和方法類似:
def squareOf(x: Int) = x * x
編譯器可以推斷出方法的返回類型為 Int
,因此不需要明確地聲明返回類型。
對于遞歸方法,編譯器無法推斷出結果類型。下面這個程序就是由于這個原因而編譯失敗:
def fac(n: Int) = if (n == 0) 1 else n * fac(n - 1)
當調用 多態方法 或實例化 泛型類 時,也不必明確指定類型參數。Scala 編譯器將從上下文和實際方法的類型/構造函數參數的類型推斷出缺失的類型參數。
看下面兩個例子:
case class MyPair[A, B](x: A, y: B)
val p = MyPair(1, "scala")
def id[T](x: T) = x
val q = id(1)
編譯器使用傳給 MyPair
參數的類型來推斷出 A
和 B
的類型。對于 x
的類型同樣如此。
編譯器從不推斷方法形式參數的類型。但是,在某些情況下,當函數作為參數傳遞時,編譯器可以推斷出匿名函數形式參數的類型。
Seq(1, 3, 4).map(x => x * 2)
方法 map 的形式參數是 f: A => B
。因為我們把整數放在 Seq
中,編譯器知道 A
是 Int
類型 (即 x
是一個整數)。因此,編譯器可以從 x * 2
推斷出 B
是 Int
類型。
通常認為,公開可訪問的 API 成員應該具有顯示類型聲明以增加可讀性。 因此,我們建議你將代碼中向用戶公開的任何 API 明確指定類型。
此外,類型推斷有時會推斷出太具體的類型。 假設我們這么寫:
var obj = null
我們就不能進行重新賦值:
obj = new AnyRef
它不能編譯,因為 obj
推斷出的類型是 Null
。由于該類型的唯一值是 null
,因此無法分配其他的值。
到此,相信大家對“scala的類型推斷是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。