[英]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
它試圖確保無論T
和U
可能在呼叫站點,(在這種情況下, U
是問題),它將在隱式范圍內具有隱式BSonReader[T, DBObject]
。 我想在一般環境中沒有。 您使用隱式參數保證在調用站點提供一個BsonReader[T,U]
。 這不是它所需要的。 如果參數不是隱式的(你必須在調用fromBson
時編寫ev),你會遇到類似的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.