Я пытаюсь определить структурный тип, определяющий любую коллекцию, которая имеет метод "add" (например, коллекция java). Используя это, я хочу определить несколько функций более высокого порядка, которые работают с определенной коллекцией
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]
Это не скомпилируется со следующей ошибкой
error: Parameter type in structural refinement may not refer to abstract type defined outside that same refinement
Я попытался удалить параметр GenericCollection и поместить его в метод:
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]
но я получаю еще одну ошибку:
error: type arguments [T,java.util.List] do not conform to trait HigherOrderFunctions type parameter bounds [T,CollectionType[X] <: org.scala_tools.javautils.j2s.GenericTypes.GenericCollection]
Может ли кто-нибудь дать мне несколько советов о том, как использовать структурную типизацию с абстрактными типизированными параметрами в Scala? Или как добиться того, чего я хочу достичь? Большое спасибо!