`implicit' 修饰符不能用于顶级对象

`implicit' modifier cannot be used for top-level objects

我最近开始研究 play & reactive mongo。引用 reactive mongo documentation 创建一个 SimpleAlbum。当我 运行 播放应用程序时,我收到类似 "Implicit modifier cannot be used for top-level objects" 的错误。为什么我得到这个?帮我解决这个问题。谢谢

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"))
 }
}

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._

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

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
}

}