Scala: ¿Cómo obtener la lista de la lista de contexto [t] que funciona aquí?
-
26-10-2019 - |
Pregunta
Esta es mi primera pregunta aquí, así que espero proporcionar suficientes detalles. No dude en pedir aclaraciones.
Teniendo en cuenta lo siguiente, lo que funciona:
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
}
}
}
Esta pieza de código convierte las opciones envueltas de BSON a otra opción [t]. Pensé que lo mismo funcionaría para las listas, pero lo siguiente no se compila:
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
}
}
Estoy usando el siguiente código para la mecánica general:
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)
}
}
Error del compilador:could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList
Esto me parece extraño ya que parece que el compilador está tratando de evaluar T antes de que Frombson haya sido llamado a suministrar un tipo. Esto me parece especialmente extraño ya que el lector de opciones parece no tener tales quejas. Recientemente comencé a codificar en Scala en serio, así que estoy seguro de que me estoy perdiendo algo aquí.
Avíseme si necesita más información y espero que pueda ayudar.
Mejor,
Puñal
Solución
En su listbsonreader, no hay razón para el tipo U. Su cursor iterate en dbobject, el mapa espera un DbObject => X
función. Supongo que tienes algo como
implicit def withFromBson[U](x: U) = new {
def fromBson[T](implicit ev : BsonReader[T,U]) : T = ...
}
En mapa, con _
escrito DBObject
, es, normalmente mirando desde BsonReader[T, DBObject]
. No proporciona ninguno en alcance implícito, solo un BsonReader[T,U]
. Solo eliminar U
y que tu parámetro implícito sea BsonReader[T,DBObject]
.
El compilador no está tratando de evaluar T
por adelantado. Está tratando de asegurar que sea lo que sea T
y U
puede estar en el sitio de llamadas (en este caso, U
es el problema), tendrá lo implícito BSonReader[T, DBObject]
Necesita en el alcance implícito. Supongo que no hay ninguno en el entorno general. Usted promete, con su parámetro implícito, que le dará uno BsonReader[T,U]
en el sitio de llamadas. Eso no es lo que necesita. Donde el parámetro no implícito (tendría que escribir el EV al llamar fromBson
), Tendría un error similar.