2009-11-12 155 views
14

int是有件事我想錯了下面的代碼片段: -從字符串隱式轉換到斯卡拉2.8

object Imp { 
    implicit def string2Int(s: String): Int = s.toInt 

    def f(i: Int) = i 

    def main(args: Array[String]) { 
    val n: Int = f("666") 
    } 
} 

我得到的從2.8編譯如下: -

信息:編譯1個錯誤
信息:0警告
... \階-2.8測試\ SRC \ Imp.scala
錯誤:錯誤:管線(4)的錯誤:類型MISM 1個錯誤和0個警告
信息完成ATCH;
發現:字符串
要求:?{VAL toInt:?}
注意,隱式轉換是不適用的,因爲它們是不明確的:
在種類型的目標進出口都方法string2Int(S:字符串)中等
和方法類型爲(x:String)的對象Predef中的augmentString scala.collection.immutable.StringOps
可能是從String到?{val toInt:?}的轉換函數
implicit def string2Int(s:String):Int = s.toInt

回答

8

還有已經是impli轉換範圍爲,從scala.Predef。您無需聲明自己的隱式轉換即可將toInt方法添加到String。你有3種選擇(我會去的最後一個!):

  • 更改方法名像asInt
  • Unimport在Predef
  • 轉換不要打擾定義自己和使用而不是自帶的Scala庫

注意,斯卡拉只會讓使用在範圍內的隱式轉換,如果它是獨特捆綁toInt

+0

感謝您的快速回復,不幸的是,如果我註釋掉我的隱含上面的內容,Predef隱含的內容並不會啓動,它只在競爭對手出現時纔出現在範圍內;-)toInt選項很好,但我正在探索一個由String類型轉換的方法,這個方法由一個類型參數確定,其中一個是String,即一個no-op。 – 2009-11-13 00:21:39

+0

明天我得用2.8來試試。我一直使用生產代碼中的toInt轉換(即使用2.7)! – 2009-11-13 00:23:08

23

發生了什麼事情是Java沒有在String上定義toInt方法。在Scala中,定義該方法的是類StringOps(Scala 2.8)或RichString(Scala 2.7)。

。另一方面,對Int以及可用的方法toInt(通過另一個隱含的,也許?),所以編譯器不知道如果是字符串轉換爲StringOps,通過定義的隱,或通過你自己的暗示去Int

要解決它,請明確調用隱式。

object Imp { 
    implicit def string2Int(s: String): Int = augmentString(s).toInt 

    def f(i: Int) = i 

    def main(args: Array[String]) { 
    val n: Int = f("666") 
    } 
} 
+0

感謝您的幫助,我沒有意識到RichString已被取代。我仍然困惑的是,當我沒有提供隱式的時候,通過augmentString的轉換沒有找到並且發生了類型錯誤。我試圖不使用顯式調用,因爲要轉換的類型是由我試圖編寫的實際方法中的類型參數提供的。 – 2009-11-13 15:59:18

+0

RichString尚未被取代,它仍然存在。不過,我不知道與AugmentedString有什麼關係。問題是編譯器不知道要調用哪個「.toInt」方法:AugmentedString上的那個或Int上的那個。 – 2009-11-13 19:02:11

+0

RichString仍然存在?我最好把這個刪除鍵簽出。 – extempore 2010-02-17 04:39:39

1

我想我有一個解決方法。

如果我從String參數創建了一個RichString,隱式轉換通過使用我提供的隱式方法(適用於2.7.x和2.8)從RichString發生到Int。如果我刪除了我的隱式,則會出現類型錯誤。

object Imp { 

    implicit def string2Int(rs: RichString): Int = rs.toInt 

    def f(i: Int) = i 

    def main(args: Array[String]) { 
    val n: Int = f(new RichString("666")) 

    println(n) 
    } 
} 

我仍然困惑,爲什麼這兩個implicits進入了範圍,當我提供了一個隱含的衝突和爲何PREDEF一個沒有接觸到的範圍時,我並沒有爲字符串提供一個詮釋。我想關於從String到Int的隱式轉換的問題仍然是打開的。