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

时间:2015-04-30 16:43:18

标签: scala implicit

我最近开始从事游戏和娱乐工作。反应性蒙戈。提到reactive mongo documentation以创建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"))
 }
}

2 个答案:

答案 0 :(得分:14)

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

object MyImplicits {

   implicit object SimpleAlbumWriter ....

   implicit object SimpleAlbumReader ....
}

然后你需要访问implicits的地方

import MyImplicits._

作为包导入的一部分。

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

package models

package object Implicits {

   implicit object SimpleAlbumWriter ....

   implicit object SimpleAlbumReader ....
}

以相同的方式导入:

import models.Implicits._

答案 1 :(得分:0)

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

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
}

}