Frage

Dies ist meine erste Frage hier. Ich hoffe, ich gebe genügend Details. Fühlen Sie sich frei, um Klärung zu bitten.

Berücksichtigung der folgenden Berücksichtigung, die funktioniert:

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
    }
  }
}

Dieses Code konvertiert die Option, die BSON -Stücke in eine andere Option [t] umgewandelt haben. Ich dachte, dass dasselbe für Listen funktionieren würde, aber das Folgende ist nicht kompiliert:

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
  }
}

Ich verwende den folgenden Code für die allgemeine Mechanik:

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)
  }
}

Compiler -Fehler:could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList

Dies ist seltsam, da es so aussieht, als ob der Compiler versucht, T von BSON zu bewerten, wurde zur Versorgung eines Typs berufen. Dies ist mir besonders seltsam, da der Optionsleser keine solchen Beschwerden zu haben scheint. Ich habe erst kürzlich ernsthaft angefangen, in Scala ernsthaft zu codieren, also bin ich sicher, dass ich hier etwas fehlt.

Bitte lassen Sie mich wissen, ob Sie weitere Informationen benötigen und hoffen, dass Sie helfen können.

Am besten,

Dolch

War es hilfreich?

Lösung

In Ihrem ListbsonReader gibt es keinen Grund für Typ U. Ihr Cursor -Itererat auf dBObject, MAP erwartet a DbObject => X Funktion. Ich denke du hast so etwas wie

implicit def withFromBson[U](x: U) = new {
   def fromBson[T](implicit ev : BsonReader[T,U]) : T = ...
}

In Karte mit _ tippt DBObject, es ist ganz normalerweise schaut von BsonReader[T, DBObject]. Sie bieten keine im impliziten Bereich, nur a BsonReader[T,U]. Einfach entfernen U und haben Sie Ihren impliziten Parameter sein BsonReader[T,DBObject].

Der Compiler versucht nicht zu bewerten T im Voraus. Es versucht sicherzustellen, dass was auch immer T und U kann auf der Anrufseite sein (in diesem Fall, U ist das Problem), es wird das implizite haben BSonReader[T, DBObject]Es braucht im impliziten Bereich. Ich denke, es gibt keine in der allgemeinen Umgebung. Sie versprechen mit Ihrem impliziten Parameter, dass Sie einen geben werden BsonReader[T,U] auf Anrufe. Das braucht es nicht. Wo der Parameter nicht implizit ist (Sie müssten das EV beim Anruf schreiben fromBson), Sie hätten einen ähnlichen Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top