Границы параметра типа Scala - PullRequest
8 голосов
/ 16 июля 2011

У меня возникли проблемы с пониманием системы границ типов в 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].Как решается эта проблема?

1 Ответ

17 голосов
/ 16 июля 2011

String сам по себе не является подтипом Iterable[Char], но его сутенер , WrappedString является.Чтобы ваше определение могло использовать неявные преобразования, вам нужно использовать границы представления (<%) вместо верхней границы типа (<:):

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
...