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

Kau*_*hik 11 scala implicit

我最近开始研究游戏和反应性mongo.引用了响应式mongo文档来创建SimpleAlbum.当我运行播放应用程序时,我收到一个错误,如"隐式修饰符不能用于顶级对象".我为什么要这个?帮助我解决问题.谢谢

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"))
 }
}
Run Code Online (Sandbox Code Playgroud)

Arn*_*sen 16

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

object MyImplicits {

   implicit object SimpleAlbumWriter ....

   implicit object SimpleAlbumReader ....
}
Run Code Online (Sandbox Code Playgroud)

然后你需要访问刚才放的implicits

import MyImplicits._
Run Code Online (Sandbox Code Playgroud)

作为包进口的一部分.

编辑:正如@mz指出的那样,使用该package对象,您可以在包级别定义implicits,如下所示:

package models

package object Implicits {

   implicit object SimpleAlbumWriter ....

   implicit object SimpleAlbumReader ....
}
Run Code Online (Sandbox Code Playgroud)

以相同的方式进口:

import models.Implicits._
Run Code Online (Sandbox Code Playgroud)

  • 也可以使用`package object`. (2认同)