【问题标题】:Scala returns different types for very similar expressionsScala 为非常相似的表达式返回不同的类型
【发布时间】:2012-02-22 08:18:28
【问题描述】:

如果我在 Scala REPL 中计算以下表达式:

scala> "1" + 1
res0: java.lang.String = 11

返回的类型是:java.lang.String

如果我评估这个类似的表达式:

scala> 1 + "1"
res1: String = 11

返回的类型是:String

为什么不一样?

【问题讨论】:

标签: java scala expression


【解决方案1】:

没有区别,但也不是错误。在这种情况下:

"1" + 1

您正在使用 Java 的内置功能将任何内容连接成字符串。毕竟,很多人使用以下“成语”将数字转换为字符串:

String s = "" + 5;

它也可以在 Scala 中使用,并且结果为 java.lang.String - 与 Java 中相同。

另一方面:

1 + "1"

有点复杂。这被翻译成:

1.+("1")

+() 方法取自位于Int.scalaInt.+ 方法:

final class Int extends AnyVal {
    //....
    def +(x: String): String = sys.error("stub")

此上下文中的StringPredef.scala 中定义:

type String        = java.lang.String

这是“差异”类型的来源。如您所见,这两个字符串实际上是同一类型。

【讨论】:

    【解决方案2】:

    "1"+1 调用 java.lang.String 的 operator+,1+"1" 调用由 scala 运行时定义的 operator+(现在找不到),所以它返回一个 scala 字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多