Scala REPL打印的是什么类型?

Scala REPL打印的是什么类型?,scala,read-eval-print-loop,Scala,Read Eval Print Loop,当我在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

当我在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如何决定打印什么作为表达式类型

简单的回答是Scala REPL打印结果的静态类型,这是从表达式
Map(1->1,2->2)
推断出来的,getClass返回动态类型,它可以是静态类型的子类型


一个较长的答案是Scala的类型推理引擎如何工作。您可能想阅读。

中的相关章节,其中静态类型是计算表达式的结果类型,而动态类型是实现该类型的实际类?啊,旧的、快速的、肮脏的答案,然后是编辑技巧,这让我的问题现在看起来很愚蠢!在最简单的情况下,中的静态类型与方法定义中的返回类型完全相同。否则(具有推断类型参数的方法、依赖隐式参数的返回类型等),您将不得不查看类型推断引擎的详细信息,因为事情可能变得相当复杂。动态类型由正在执行的方法体中发生的事情给出(这里,相关的方法是
Map.apply()
)。@Duncan对编辑感到抱歉;读了我的答案后,我还认为需要澄清一下。没问题,只是让我觉得好笑。我正在努力通过Scala Koans并试图获得启示。