Ich versuche, einen Strukturtyp zu definieren, der jede Sammlung definiert, die über eine "add" -Methode verfügt (z. B. eine Java-Sammlung). Mit diesem möchte ich ein paar Funktionen höherer Ordnung definieren, die auf einer bestimmten Sammlung arbeitenVerwenden von Scala-Strukturtypen mit abstrakten Typen
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]
Das funktioniert nicht mit dem folgenden Fehler kompilieren
error: Parameter type in structural refinement may not refer to abstract type defined outside that same refinement
Ich habe versucht, den Parameter auf GenericCollection entfernen und setzen über die Methode:
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]
aber ich bekomme einen anderen Fehler:
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]
Kann mir jemand einen Tipp geben, wie man strukturelle Typisierung mit abstrakten typisierten Parametern in Scala verwendet? Oder wie erreiche ich, was ich erreichen möchte? Vielen Dank!