Scala: Come ottenere contesto bound List [T] conversione lavorare qui?
-
26-10-2019 - |
Domanda
Questa è la mia prima domanda qui quindi spero che fornisco sufficiente dettaglio. Sentitevi liberi di chiedere chiarimenti.
Prendendo in considerazione quanto segue, che funziona:
implicit def optionBsonReader[T, U](implicit ev: BsonReader[T, U]) = new BsonReader[Option[T], Option[U]] {
def read(obj: Option[U]): Option[T] = {
obj match {
case Some(x) => Some(x.fromBson[T])
case None => None
}
}
}
Questo pezzo di convertiti codice opzione avvolto pezzi di BSON all'altro Opzione [T]. Ho pensato che lo stesso avrebbe funzionato per gli elenchi, ma di seguito non viene compilato correttamente:
implicit def listBsonReader[T, DBObject](implicit ev: BsonReader[T, DBObject]) = new BsonReader[List[T], MongoCursor] {
def read(cur: MongoCursor): List[T] = {
cur.map(_.fromBson[T]).toList
}
}
Sto usando il seguente codice per la meccanica generale:
package object bson {
def bsonReader[A, B](implicit reader: BsonReader[A, B]) = reader
def bsonWriter[A, B](implicit writer: BsonWriter[A, B]) = writer
implicit def addWriter[A](any: A): WithWriter[A] = new WithWriter(any)
implicit def addReader[A](any: A): WithReader[A] = new WithReader(any)
}
package bson {
private[bson] class WithWriter[A](any: A) {
def toBson[B](implicit writer: BsonWriter[A, B]): B = writer.write(any)
}
private [bson] class WithReader[B](any: B) {
def fromBson[A](implicit reader: BsonReader[A, B]): A = reader.read(any)
}
}
Errore di ??Compiler:
could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList
Questo mi sembra strano in quanto sembra che il compilatore sta cercando di valutare T prima fromBson è stato chiamato per la fornitura di un tipo. Questo mi sembra particolarmente strano dato che il lettore opzione sembra non avere tali denunce. Ho da poco iniziato a codice a Scala sul serio, quindi sono sicuro che mi manca qualcosa qui.
Per favore fatemi sapere se avete bisogno di più informazioni e spero che tu possa aiutare.
Best,
Dirk
Soluzione
Nel vostro listBsonReader, non c'è motivo per il tipo U. Il cursore iterata sulla DBOBJECT, carta prevede una funzione DbObject => X
. Credo di avere qualcosa di simile
implicit def withFromBson[U](x: U) = new {
def fromBson[T](implicit ev : BsonReader[T,U]) : T = ...
}
In mappa, con _
digitato DBObject
, è, abbastanza normalmente alla ricerca da BsonReader[T, DBObject]
. Si forniscono nessuno portata implicita, solo BsonReader[T,U]
. Basta rimuovere U
e hanno il parametro implicito BE BsonReader[T,DBObject]
.
Il compilatore non sta cercando di valutare T
in anticipo. Si sta cercando di garantire che tutto ciò che T
e U
possono essere al sito di chiamata, (in questo caso, U
è il problema), avrà la BSonReader[T, DBObject]
implicita di cui ha bisogno in ambito implicito. Credo che ci sia nessuno nel contesto generale. Prometti, con il parametro implicito, che si darà un BsonReader[T,U]
al sito di chiamata. Questo non è ciò di cui ha bisogno. Quando il parametro non implicita (che si sarebbe dovuto scrivere l'ev al momento della chiamata fromBson
), si avrebbe un errore simile.