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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top