2012-12-27 40 views
2

我是Scala新手,我注意到了一個我不明白的行爲。當我執行這個代碼一切順利就好了:從List [Int]到List [Double]的隱式轉換失敗

val lD: List[Double] = List(1, 2, 3) 

然而,當我執行這一個:

val lI = List(1, 2, 3) 
val lD: List[Double] = lI 

我得到一個錯誤

<console>:11: error: type mismatch; 
found : List[Int] 
required: List[Double] 

可以請你給我一個線索,爲什麼隱式轉換不會在第二個列表中發生?

回答

8

沒有從List [Int]到List [Double]定義的隱式轉換,但如果您真的想要一個,您可以創建一個。請參閱以下內容:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_37). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> val i = 1 
i: Int = 1 

scala> val d: Double = i 
d: Double = 1.0 

scala> val il = List(1,2,3,4) 
il: List[Int] = List(1, 2, 3, 4) 

scala> val dl: List[Double] = il 
<console>:8: error: type mismatch; 
found : List[Int] 
required: List[Double] 
     val dl: List[Double] = il 
          ^

scala> object il2dl { implicit def intlist2dlist(il: List[Int]): List[Double] = il.map(_.toDouble) } 
defined module il2dl 

scala> import il2dl._ 
import il2dl._ 

scala> val dl: List[Double] = il 
dl: List[Double] = List(1.0, 2.0, 3.0, 4.0) 

scala> 
+0

啊,我明白了。謝謝!這意味着'lD:List [Double] = List(1,2,3)'僅僅因爲根據目標類型進行輸入而成功了(所以類型推理器會發現'List(1,2,3)'必須是'List [Double]'),而不是因爲'List [Int]'可以隱式轉換爲'List [Double]',對嗎? –

+0

它成功了,因爲我在il2dl對象中定義並導入了自己的隱式轉換。在定義它之前,不存在這種轉換。需要進口才能將其納入範圍。 –

+0

是的,我知道。然而,即使沒有定義隱式轉換,賦值'lD:List [Double] = List(1,2,3)'也是可能的 - 這僅僅是因爲類型推理器將'List(1,2,3)'視爲'List [雙](1,2,3)'? –

4

只是變換列表[INT]列出[雙]明確:

val lI = List(1, 2, 3) 
val lD: List[Double] = lI map (_.toDouble) 
相關問題