我在理解Scala的类型界限系统时遇到了一些麻烦。我想要做的是使一个拥有类T的持有人类,该类可以迭代A类的项目。到目前为止,我有:

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

最佳答案

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] = HasIterable@77f2fbff

10-06 12:35