Границы параметра типа Scala
У меня возникли проблемы с пониманием системы границ типов в 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 ответ
Решение
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