Ho un paio di funzioni il cui unico parametro è che ha una sorta di raccolta che è anche fattibile (cioè potrebbe essere una coda, elenco, prioritàQualità, ecc.), Quindi ho tentato di creare il seguente tipo alias:Errore alias tipo ricorsivo Scala
type Frontier = Growable[Node] with TraversableLike[Node, Frontier]
da usare con definizioni di funzioni in questo modo:
def apply(frontier: Frontier) = ???
ma il tipo alias restituisce l'errore "Illegal riferimento ciclico coinvolge tipo frontiera". C'è un modo per aggirare il riferimento ciclico illegale per usare il tipo alias o qualcosa di simile ad esso?
Una soluzione è quella di utilizzare il seguente:
def apply[F <: Growable[Node] with TraversableLike[Node, F]](f: F) = ???
ma questo sembra aggiungere prolissità inutili quando la definizione di funzione sta facendo apparentemente la stessa cosa esatta come tipo di alias. Il tipo viene utilizzato anche in altri luoghi, quindi un alias di tipo aumenterebbe notevolmente la leggibilità.
La prima soluzione è ciò che stavo cercando. Il motivo per cui avevo bisogno di questo tipo è fondamentalmente il parametro può essere qualsiasi collezione che posso aggiungere a (quindi Growable), e il tipo di ritorno di molte delle funzioni in Traversable [Node] sarebbe solo Traversable [Node] in contrapposizione a Traversable [ Nodo] con Growable [Node]. In particolare, sto usando le operazioni '+ =', 'head',' tail', 'find' e' filterNot'. È possibile che riformuli il problema per non richiedere '+ =' e quindi non richieda Growable, ma non ho ancora esplorato quella strada. –
Come si dichiara un tipo che è Frontiera? – user1453345