2015-05-24 81 views
0

我在Scala中遇到了一個問題我真的被困住了。我知道標題可能更混亂,所以讓我儘可能簡單地解釋它。想象一下,我有一個叫Repoabstract class。這個類描述了幾個方法,其中大部分已經實現。類Repo看起來是這樣的:從實現中導入泛型類的隱式變量

abstract class Repo[T](name: String) { 

    implicit def collection(implicit db: DefaultDB): JSONCollection = 
    db.collection[JSONCollection](name) 

    def findOne(selector: JsObject)(implicit collection: JSONCollection): Future[Option[T]] = { 
    collection.find(selector).one[T] 
    } 

    ... 

} 

基本實現這個類的應該是這樣的:

import models.Models.Resume._ 

object ResumeRepo extends Repo[Resume]("resumes") 

現在,如果我嘗試編譯此,它給了我一個錯誤,他說:「沒有找到類型爲Json的串行器。嘗試實現這種類型的隱式Writes或Format。「這很奇怪,因爲我在ResumeRepo實現類中明確包含了隱含的Format。爲什麼這個錯誤顯示?

+0

奇怪的是,該警告提到'T'代替解析爲在編譯時這種類型的參數的類型。 – cchantep

+0

那麼..你說你明確擁有'Format'或'Writes'的實現在哪裏? –

+0

@ m-z它在簡歷模型中定義。 Resume模型只是一個案例類,格式只是基於案例類。我需要包含它嗎? – Martijn

回答

1

我想one[T]預計隱式Reads[T]可以在其應用程序站點訪問。這意味着隱式在findOne的定義中選擇,Repo類別中的通用類型爲T。所以你需要在那裏做一個隱含的可見。

您有三種選擇。您可以Reads[T]

  • 類型添加一個隱含參數findOne:

    def findOne(selector: JsObject)(implicit collection: JSONCollection, readsT : Reads[T]) : ... 
    

    這樣隱時具有findOne被稱爲是可見的。

  • 爲類隱含參數:

    abstract class Repo[T](name: String)(implicit readsT : Reads[T]) { ... 
    

這樣,它是可見的Repo任何地方,但它必須是在繼承和實例化網站可見。例如,您不能將隱含在RepoResume中,因爲它必須在創建對象時可見。抽象類的

  • finaly作爲抽象值構件

    abstract class Repo[T](name: String) { 
        implicit val readsT : Reads[T] 
    ... 
    } 
    
    object RepoResume extends Repo[Resume]("resume") { 
        implicit val readsT : Reads[T] = .... 
    } 
    
+0

你能否告訴我爲什麼集合的「隱式def」不能正常工作。我只是編寫了你的​​建議,現在也給了我一個錯誤。 – Martijn

+0

你能複製粘貼錯誤嗎? –

+0

'找不到參數集合的隱式值:JSONCollection' – Martijn