繁体   English   中英

Scala:如何获取上下文绑定List [T]转换在这里工作?

[英]Scala: How to get context bound List[T] conversion working here?

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

考虑以下因素,有效:

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

这让我觉得很奇怪,因为看起来编译器在调用fromBson来提供类型之前试图评估T. 这让我觉得特别奇怪,因为期权读者似乎没有这样的抱怨。 我最近才开始认真地在Scala中编码,所以我确信我在这里遗漏了一些东西。

如果您需要更多信息,请告诉我,希望您能提供帮助。

最好,

短剑

在你的listBsonReader中,没有理由输入类型U.你的游标在DBObject上迭代,map需要一个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 它试图确保无论TU可能在呼叫站点,(在这种情况下, U是问题),它将在隐式范围内具有隐式BSonReader[T, DBObject] 我想在一般环境中没有。 您使用隐式参数保证在调用站点提供一个BsonReader[T,U] 这不是它所需要的。 如果参数不是隐式的(你必须在调用fromBson时编写ev),你会遇到类似的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM