【问题标题】:`implicit' modifier cannot be used for top-level objects`implicit' 修饰符不能用于顶级对象
【发布时间】:2015-04-30 16:43:17
【问题描述】:

我最近开始研究 play 和响应式 mongo。参考reactive mongo documentation 创建一个 SimpleAlbum。当我运行 play 应用程序时,我收到类似“隐式修饰符不能用于顶级对象”的错误。为什么我会得到这个?帮助我解决问题。谢谢

package models

import org.joda.time.DateTime
import reactivemongo.bson._


case class SimpleAlbum(
                    title: String,
                    releaseYear: Int,
                    hiddenTrack: Option[String],
                    allMusicRating: Option[Double])

implicit object SimpleAlbumWriter extends BSONDocumentWriter[SimpleAlbum] {
def write(album: SimpleAlbum): BSONDocument = BSONDocument(
   "title" -> album.title,
   "releaseYear" -> album.releaseYear,
   "hiddenTrack" -> album.hiddenTrack,
   "allMusicRating" -> album.allMusicRating)
}

implicit object SimpleAlbumReader extends BSONDocumentReader[SimpleAlbum] {
def read(doc: BSONDocument): SimpleAlbum = {
SimpleAlbum(
  doc.getAs[String]("title").get,
  doc.getAs[Int]("releaseYear").get,
  doc.getAs[String]("hiddenTrack"),
  doc.getAs[Double]("allMusicRating"))
 }
}

【问题讨论】:

    标签: scala implicit


    【解决方案1】:

    implicit 不能在包级别使用。您需要将隐式对象放在另一个对象中,然后您可以将其导入需要隐式的位置,例如:

    object MyImplicits {
    
       implicit object SimpleAlbumWriter ....
    
       implicit object SimpleAlbumReader ....
    }
    

    然后你需要访问隐含的地方

    import MyImplicits._
    

    作为包导入的一部分。

    编辑:正如@m-z 指出的那样,使用package 对象,您可以像这样在包级别定义隐式:

    package models
    
    package object Implicits {
    
       implicit object SimpleAlbumWriter ....
    
       implicit object SimpleAlbumReader ....
    }
    

    以同样的方式导入:

    import models.Implicits._
    

    【讨论】:

    • 也可以使用package object
    • 我想知道这一点。不确定是否在包对象级别强制执行顶级约束
    • 是的,这是一种特殊情况,对象名称可能与包路径冲突,package object 中的所有内容都在该包的范围内。例如,package object models { val a = 1 } 使 a 在整个 package models 中可用。
    【解决方案2】:

    隐式类需要添加到对象中:

    object StudentTest {
     implicit class stringUtils(myString:String){
     def scalaWordCount(): Map[String, Int] ={
      val split=myString.split("\\s+")
      val grouped=split.groupBy(word=>word)
      val counterPerKey=grouped.mapValues(group=>group.length)
      counterPerKey
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 2013-04-27
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多