Ho letto diversi articoli che esprimono che i tipi astratti devono essere utilizzati per ottenere il polimorfismo con f-bound in Scala. Questo è principalmente per alleviare i problemi di inferenza di tipo, ma anche per rimuovere la crescita quadratica che i parametri di tipo sembrano introdurre quando si definiscono i tipi ricorsivi.Polimorfismo F-Bounded con tipi astratti in Scala
Questi sono definiti come in:
trait EventSourced[E] {
self =>
type FBound <: EventSourced[E] { type FBound <: self.FBound }
def apply(event: E): FBound
}
Tuttavia, questo sembra introdurre due problemi:
1) Ogni volta che un utente desidera fare riferimento a un oggetto di questo tipo, devono anche fare riferimento il parametro di tipo FBound
. Questo si sente come un odore di codice:
def mapToSomething[ES <: EventSourced[E], E](eventSourced: ES#FBound): Something[ES, E] = ...
2) Il compilatore è ora in grado di dedurre parametri di tipo per i metodi, come il precedente, non riuscendo con il messaggio:
Type mismatch, expected: NotInferredES#FBound, actual: MyImpl#FBound
qualcuno là fuori con un implementazione riuscita del polimorfismo delimitato da f nella loro soluzione, per cui il compilatore è ancora in grado di inferire i tipi?
Il collezioni libreria Scala utilizza F-delimitata polimorfismo con successo senza problemi. Utilizza i parametri del tipo anziché i membri del tipo, potresti provare una soluzione basata su questo. – wingedsubmariner
Per favore, puoi darmi un esempio da guardare, cioè quali parti della biblioteca fanno questo? –
Vedere [Elenco] (http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List) nella libreria standard. Si noti il polimorfismo con F-bounded utilizzato nella sua ereditarietà di GenericTraversableTemplate e LinearSeqOptimized. – wingedsubmariner