Ich habe ein paar Funktionen, deren einzige Parameter Anforderung ist, dass es eine Art von Sammlung, die auch growable (dh es könnte eine Warteschlange, Liste, PriorityQueue, etc.) sein könnte, also versuchte ich erstellen Sie die folgende Art alias:Scala rekursive Art Alias-Fehler
type Frontier = Growable[Node] with TraversableLike[Node, Frontier]
wie so mit Funktionsdefinitionen zu verwenden:
def apply(frontier: Frontier) = ???
aber die Art Alias gibt den Fehler "Illegal zyklische Referenz Einbeziehung Typ Frontier." Gibt es eine Möglichkeit, die illegale zyklische Referenz zu umgehen, um den Typalias oder etwas Ähnliches zu verwenden?
Eine Lösung ist die folgende verwenden:
def apply[F <: Growable[Node] with TraversableLike[Node, F]](f: F) = ???
aber dieses scheint hinzufügen unnötige Ausführlichkeit, wenn die Funktionsdefinition scheinbar genau wie die Art alias gleiche tun wird. Der Typ wird auch an anderen Stellen verwendet, so dass ein Typalias die Lesbarkeit stark erhöht.
Die erste Lösung ist, was ich gesucht habe. Der Grund, warum ich diesen Typ brauchte, ist im Grunde der Parameter kann jede Sammlung sein, die ich hinzufügen kann (daher Growable), und der Rückgabetyp vieler der Funktionen in Traversable [Node] wäre nur Traversable [Node] im Gegensatz zu Traversable [ Knoten] mit Growable [Node]. Insbesondere verwende ich die Operationen '+ =', 'head',' tail', 'find' und' filterNot'. Es ist möglich, dass ich das Problem neu formulieren könnte, um "+ =" nicht zu benötigen und somit Growable nicht zu benötigen, aber ich habe diese Möglichkeit noch nicht erforscht. –
Wie deklarieren Sie einen Typ, der Frontier ist? – user1453345