Scala: Как получить контекстный список [t] преобразование здесь?
-
26-10-2019 - |
Вопрос
Это мой первый вопрос здесь, так что надеюсь, что я предоставлю достаточно деталей. Не стесняйтесь просить разъяснения.
Принимая во внимание следующее, что работает:
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
}
}
}
Этот кусок кода преобразует опцию, обернутые кусочки BSON в другой опцию [T]. Я думал, что то же самое будет работать для списков, но следующее не компилируется:
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
}
}
Я использую следующий код для общей механики:
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)
}
}
Ошибка компилятора:could not find implicit value for parameter reader: project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject] cur.map(_.fromBson[T]).toList
Это поражает меня как странного, так как кажется, что компилятор пытается оценить T до того, как Frombson был вызван для обеспечения типа. Это поражает меня особенно странным, поскольку у читателя опционов, похоже, нет таких жалоб. Я только недавно начал кодировать в Scala всерьез, поэтому я уверен, что я что -то упускаю здесь.
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, и надеюсь, что вы можете помочь.
Лучший,
Дирк
Решение
В вашем списке. DbObject => X
функция Я думаю, у тебя есть что -то вроде
implicit def withFromBson[U](x: U) = new {
def fromBson[T](implicit ev : BsonReader[T,U]) : T = ...
}
В карте, с _
напечатано DBObject
, это довольно обычно смотрю от BsonReader[T, DBObject]
. Анкет Вы не предоставляете ни одного в неявном масштабе, только BsonReader[T,U]
. Анкет Просто удалите U
и пусть ваш неявный параметр будет BsonReader[T,DBObject]
.
Компилятор не пытается оценить T
заблаговременно. Он пытается убедиться, что все T
а также U
может быть на сайте Call, (в данном случае, U
проблема), у него будет неявный BSonReader[T, DBObject]
Это нужно в неявном масштабе. Я думаю, что в общей среде нет. Вы обещаете с вашим неявным параметром, что вы дадите один BsonReader[T,U]
на сайте звонка. Это не то, что ему нужно. Где параметр не подразумевается (вам придется написать EV при звонке fromBson
), у вас будет аналогичная ошибка.