Scala REPL打印的是什么类型?

4

当我在repl中创建一个小型地图时,它告诉我它的类型是immutable.Map。

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如何决定打印表达式的类型?
1个回答

7
Scala REPL打印的是您的结果的静态类型,该类型是从您的表达式Map(1->1, 2->2)推断出来的。而getClass返回的是动态类型,可以是静态类型的子类型。
更长的答案涉及到Scala类型推断引擎的工作原理。您可能需要阅读Scala语言参考中的相关章节。

静态类型是表达式计算的结果类型,动态类型是实现该类型的实际类? - Duncan McGregor
啊,老旧的、快速而肮脏的回答后面跟着一个编辑技巧,现在让我的问题看起来很愚蠢! - Duncan McGregor
在最简单的情况下,静态类型与方法定义中的返回类型完全相同。否则(带有推断类型参数的方法,返回类型取决于隐式参数等),您将不得不查看类型推断引擎的详细信息,因为事情可能会变得非常复杂。动态类型是由正在执行的方法体中确切发生的事情(这里相关的方法是Map.apply())所确定的。 - Jean-Philippe Pellet
@Duncan 对于我的编辑感到抱歉;我在回答后立刻意识到需要澄清一下。 - Jean-Philippe Pellet
没问题,只是让我感到好笑。我正在逐步学习Scala Koans,并努力获得推理的启示。 - Duncan McGregor
如果你觉得你的评论看起来很愚蠢(尽管在我看来并不是这样),你随时可以删除它们。 - Jean-Philippe Pellet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接