2011-04-20 82 views
4

當我創建的REPL一個小地圖,它告訴我,它的類型是immutable.MapScala REPL打印的類型是什麼?

scala> Map(1->1, 2->2)          
res8: scala.collection.immutable.Map[Int,Int] = Map((1,1), (2,2)) 

這並不是全部的真相不過,因爲在這種情況下

scala> Map(1->1, 2->2).getClass 
res9: java.lang.Class[_] = class scala.collection.immutable.Map$Map2 

如何Scala會決定打印什麼類型的表達式?

回答

7

簡短的回答是,Scala REPL打印結果的靜態類型,從表達式Map(1->1, 2->2)推斷出來,getClass返回動態類型,它可以是靜態類型的子類型。

更長的答案是關於Scala的類型推理引擎是如何工作的。您可能需要閱讀Scala Language Reference中的相關章節。

+0

其中靜態類型是評估的表達式的結果類型,動態類型是實現該類型的實際類? – 2011-04-20 21:03:40

+0

啊,一個古老,快速和骯髒的答案後面跟着編輯技巧,現在讓我的問題看起來很愚蠢! – 2011-04-20 21:05:52

+0

最簡單的情況下,給定的靜態類型與方法定義中的返回類型完全相同。否則(具有推斷的類型參數的方法,依賴於隱式參數的返回類型等),您必須檢查類型推斷引擎的細節,因爲事情會變得非常複雜。動態類型由正在執行的方法體內發生的事情給出(這裏,相關的方法是'Map.apply()')。 – 2011-04-20 21:06:53

相關問題