Scala中这个隐式演员的背后是什么?

时间:2012-11-13 15:03:40

标签: scala casting

我不熟悉Scala,并在使用交互模式时遇到以下问题:

scala>"abc"+4
res0: java.lang.String = abc4
scala>4+"abc"
res1: String = 4abc

我很好奇的是结果的类型如何不同(java.lang.String vs String)。在Book Seven Languages in Seven Weeks 中,这两种类型都是java.lang.String

BTW,scala解释器的版本是2.9.1。

2 个答案:

答案 0 :(得分:7)

在JVM上,scala的String只是java.lang.String的别名。 Repl有时将类型显示为String,有时显示为java.lang.String这一事实只是次要的(REPL特定的)故障,不会以任何方式影响运行时行为。

对于它的价值,这是我在scala 2.10-RC1中得到的:

scala> "abc"+4
res0: String = abc4

scala> 4+"abc"
res1: String = 4abc

答案 1 :(得分:0)

你想要什么???

scala> (4+"abc").getClass.getName
res3: java.lang.String = java.lang.String

scala> ("abc"+4).getClass.getName
res5: java.lang.String = java.lang.String

两者都是java.lang.String。 我认为互动口译员只是说String而不是java.lang.String。 但我们有java.lang.String实例。

("abc"+4): '+' is applied to java.lang.String, and returns java.lang.String. This is true both on Java and Scala.

(4+"abc") on Java: '+' is applied to java.lang.Integer, and returns java.lang.String.

(4+"abc") on Scala: '+' is applied to scala.Int, and returns String. '+(x: String)' is defined on scala.Int.

在Interactive Interpreter的输出处,应用了type String = java.lanag.String,它在Predef.scala上定义。当然,反过来没有定义。

  

这看起来很脏

我不这么认为。

  

应该是一致的,以便它们始终是String

我不这么认为。这是一致的。

java版“1.7.0_09”

Scala代码运行版2.9.2