2011-04-20 86 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

相关问题