2011-07-15 203 views
8

我在理解scala的類型範圍系統時遇到了一些麻煩。我想要做的就是保存類型T的項目,可以遍歷A型的項目我至今是一個holder類:Scala類型參數範圍

class HasIterable[T <: Iterable[A], A](item:T){ 
    def printAll = for(i<-item) println(i.toString) 
} 

val hello = new HasIterable("hello") 

本身成功編譯的類,但在嘗試創建在hello值給我這個錯誤:

<console>:11: error: inferred type arguments [java.lang.String,Nothing] do 
not conform to class HasIterable's type parameter bounds [T <: Iterable[A],A] 
    val hello = new HasIterable("hello") 
      ^

我本來期望hello解決在這種情況下,一個HasIterable[String, Char]。這個問題如何解決?

回答

17

String本身不是Iterable[Char]的子類型,但它的pimp,WrappedString是。爲了讓您的定義利用隱式轉換,你需要使用一個view bound<%),而不是一個upper type bound<:):

class HasIterable[T <% Iterable[A], A](item:T){ 
    def printAll = for(i<-item) println(i.toString) 
} 

現在您的示例將工作:

scala> val hello = new HasIterable("hello")    
hello: HasIterable[java.lang.String,Char] = [email protected] 
+1

會你介意解釋爲什麼這個工作(而另一個不)? – dhg

+0

這對我有用,謝謝!是的,爲什麼<%在這種情況下工作? --aha我看到你的編輯。謝謝:) – Dylan

+0

@pelotom:很好的解釋。謝謝! – dhg