2015-05-24 43 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