Scala:如何让上下文绑定列表[T]转换在这里工作?

Scala:如何让上下文绑定列表[T]转换在这里工作?,scala,implicits,context-bound,Scala,Implicits,Context Bound,这是我在这里的第一个问题,希望我能提供足够的细节。请随时要求澄清 考虑到以下因素,这是可行的: 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.from

这是我在这里的第一个问题,希望我能提供足够的细节。请随时要求澄清

考虑到以下因素,这是可行的:

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)
  }
}
编译器错误:
找不到参数读取器的隐式值:project.marshalling.bson.BsonReader[T,com.mongodb.casbah.Imports.DBObject]cur.map(u.fromBson[T])。toList

这让我感到奇怪,因为编译器似乎在调用fromBson提供类型之前尝试计算T。这让我觉得特别奇怪,因为选项阅读器似乎没有这样的抱怨。我最近才开始认真地用Scala编写代码,所以我确信我遗漏了一些东西

请让我知道如果你需要更多的信息,希望你能帮助

最好的


Dirk

在listBsonReader中,没有理由键入U。光标在DBObject上迭代,map需要一个
DBObject=>X
函数。我猜你有点像

implicit def withFromBson[U](x: U) = new {
   def fromBson[T](implicit ev : BsonReader[T,U]) : T = ...
}
在地图中,通过键入
\uu
DBObject
,它通常是从
BsonReader[T,DBObject]
查看的。您在隐式作用域中不提供任何内容,只提供一个
BsonReader[T,U]
。只需删除
U
,并将隐式参数设置为
BsonReader[T,DBObject]


编译器未尝试提前计算
T
。它试图确保无论调用站点上有什么
T
U
(在这种情况下,
U
是问题所在),它都会在隐式范围内包含它需要的隐式
BSonReader[T,DBObject]
。我想在一般环境中没有。使用隐式参数,您承诺将在调用站点提供一个
BsonReader[T,U]
。这不是它所需要的。如果参数不是隐式的(当从BSON调用
时,您必须将ev写入),则会出现类似的错误

有些地方不太适合这里,您引用的任何代码中都没有参数
reader
。您能给出一个代码示例以及该示例中发生的确切错误吗。。。在粘贴到这里之前没有任何编辑。BsonReader[T,DBObject]也有同样的问题。请参阅已编辑的问题。当然,您的DBObject类型参数隐藏了实际的DBObject,这与调用参数U无异。您需要的是def listBsonReader[T],只有一个类型参数。您完全正确!我还可以通过显式地将uo转换为DBObject来编译它,但这要好得多。Scala的类型系统对我来说很难真正理解。我希望将来它会引起更多的头痛,但我喜欢它能带来的一切。非常感谢你的帮助!