2011-03-30 71 views
1

我今天從Scala開始,我遇到了一個有趣的問題。我運行,爲表達遍歷字符串中的字符,像這樣的:Scala:「隱式轉換不適用」中的表達式很簡單

class Example { 
    def forString(s: String) = { 
    for (c <- s) { 
     // ... 
    } 
    } 
} 

,並始終與消息失敗:

 
error: type mismatch; 
    found : Int 
    required: java.lang.Object 
Note that implicit conversions are not applicable because they are ambiguous: 
    ... 
    for (c <- s) { 
     ^
one error found 

我試圖改變環路幾件事情,包括使用字符串的長度和使用硬編碼的數字(僅用於測試),但無濟於事。在網上搜索沒有取得任何要麼...

編輯:此代碼是最小的,我可以將其降低到,同時還產生了錯誤:

class Example { 
    def forString(s: String) = { 
    for (c <- s) { 
     println(String.format("%03i", c.toInt)) 
    } 
    } 
} 

的錯誤是一樣的以上,並在編譯時發生。在'解釋器'中運行產生相同的結果。

+2

如果您顯示更多/全部代碼,這將有所幫助。你顯示的代碼片段似乎沒問題。 – Fabian 2011-03-30 07:26:01

+1

顯示問題的郵政編碼。如果帖子太長,則從其中刪除線條,直到獲得顯示問題的最小樣本。你甚至可以找出問題所在。 – 2011-03-30 14:02:06

回答

1

不要使用原始String.format方法。請在隱式轉換的RichString上使用.format方法。它會爲你打開原始文件。即

[email protected]:~$ scala 
Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> class Example { 
    | def forString(s: String) = { 
    |  for (c <- s) { 
    |  println("%03i".format(c.toInt)) 
    |  } 
    | } 
    | } 
defined class Example 

scala> new Example().forString("9") 
java.util.UnknownFormatConversionException: Conversion = 'i' 

更接近但不完全。您可能想嘗試使用"%03d"作爲格式字符串。

scala> "%03d".format("9".toInt) 
res3: String = 009 
0

我想你的代碼(有額外的println)和它的作品在2.8.1:

class Example { 
    | def forString(s:String) = { 
    | for (c <- s) { 
    | println(c) 
    | } 
    | } 
    | } 

它可用於:

new Example().forString("hello") 
h 
e 
l 
l 
o 
+0

如何嘗試_same_代碼? – Blaisorblade 2011-03-30 23:23:18

1

斯卡拉2.81生成以下,更清晰的錯誤:

scala> class Example { 
    | def forString(s: String) = { 
    |  for (c <- s) {    
    |  println(String.format("%03i", c.toInt)) 
    |  }           
    | }           
    | }            
<console>:8: error: type mismatch;     
found : Int          
required: java.lang.Object       
Note: primitive types are not implicitly converted to AnyRef. 
You can safely force boxing by casting x.asInstanceOf[AnyRef]. 
      println(String.format("%03i", c.toInt))   
           ^       

考慮到有關的String.format其他建議,下面是上面的代碼最小修復:

scala> def forString(s: String) = { 
    | for (c: Char <- s) { 
    | println(String.format("%03d", c.toInt.asInstanceOf[AnyRef])) 
    | }} 
forString: (s: String)Unit 

scala> forString("ciao") 
099 
105 
097 
111 

在這種情況下,使用隱式格式甚至更好,但如果您需要再次調用Java可變參數方法,則這是一種解決方案,它可以工作AYS。

+0

我努力選擇哪個答案來選擇......但我最終在這裏選擇了+1。 – 2011-03-30 23:51:30

+0

我同意;這個答案解釋瞭如何使代碼類型檢查,但另一個答案解釋了你應該寫更好的代碼(正如我所說的);所以它們是互補的。無論如何謝謝,我感謝! – Blaisorblade 2011-04-04 19:46:15

+0

更簡單的是'c:Integer'。 – 2014-07-27 06:17:44