簡體   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