2012-01-30 36 views
5

返回不同類型如果我評價斯卡拉REPL下面的表達式:斯卡拉非常類似的表述

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

返回類型爲:java.lang.String中

如果我評價這種類似的表達:

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

返回類型爲:字符串

爲什麼區別?

+2

相似問題:http://stackoverflow.com/questions/6559938/scala-string-vs-java-lang-string-type-in​​ference – 2012-01-30 14:51:58

+3

都在Scala 2.10中返回'String'。 – soc 2012-01-30 15:25:34

回答

14

沒有區別,但它也不是一個錯誤。在這種情況下:

"1" + 1 

您正在使用Java的內置功能將任何內容連接到字符串中。畢竟,許多人將數字轉換到使用下面的「成語」的字符串:

String s = "" + 5; 

它工作在斯卡拉以及和結果與java.lang.String - 相同的Java。

在另一方面:

1 + "1" 

是一個有點複雜。這個被翻譯成:

1.+("1") 

+()方法是從Int.+方法位於Int.scala採取:

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

String在此上下文中在Predef.scala定義:

type String  = java.lang.String 

其是類型的來源「區別「。正如你可以看到這兩個字符串實際上是相同的類型。

2

"1"+1調用java.lang.String的operator +,1+"1"調用由scala運行時定義的運算符+(現在無法找到它),因此它返回一個scala字符串。