Scala类型参数边界

时间:2011-07-15 21:33:51

标签: scala type-systems type-parameter

我在理解scala的类型边界系统时遇到了一些麻烦。我要做的是创建一个持有者类,它包含可以迭代A类项目的T类项目。到目前为止,我所拥有的是:

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]解决。这个问题是如何解决的?

1 个答案:

答案 0 :(得分:17)

String本身不是Iterable[Char]的子类型,但其pimpWrappedString是。为了使您的定义能够使用隐式转换,您需要使用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] = HasIterable@77f2fbff