Próbuję zdefiniować typ strukturalny definiujący kolekcję, która ma metodę "dodaj" (na przykład kolekcja java). Korzystanie z tego, chciałbym zdefiniować kilka funkcja wyższego rzędu, które działają na pewnej kolekcjiUżywanie typów strukturalnych Scala z typami abstrakcyjnymi
object GenericTypes {
type GenericCollection[T] = { def add(value: T): java.lang.Boolean}
}
import GenericTypes._
trait HigherOrderFunctions[T, CollectionType[X] <: GenericCollection[X]] {
def map[V](fn: (T) => V): CollectionType[V]
....
}
class RichJList[T](list: List[T]) extends HigherOrderFunctions[T, java.util.List]
To nie skompilować z powodu następującego błędu
error: Parameter type in structural refinement may not refer to abstract type defined outside that same refinement
próbowałem usunięcie parametru na GenericCollection i umieszczenie go na metodzie:
object GenericTypes {
type GenericCollection = { def add[T](value: T): java.lang.Boolean}
}
import GenericTypes._
trait HigherOrderFunctions[T, CollectionType[X] <: GenericCollection]
class RichJList[T](list: List[T]) extends HigherOrderFunctions[T, java.util.List]
ale dostaję kolejny błąd:
error: type arguments [T,java.util.List] do not conform to trait HigherOrderFunctions's type parameter bounds [T,CollectionType[X] <: org.scala_tools.javautils.j2s.GenericTypes.GenericCollection]
Czy ktoś może mi doradzić jak używać typowania strukturalnego przy pomocy parametrów pisanych abstrakcyjnie w Scali? Albo jak osiągnąć to, co chcę osiągnąć? Dzięki wielkie!