ADT 的编解码器无法编译



我正在使用scala驱动程序对mongodb进行IO操作。我的 scala 版本是2.11.11的,mongo db 驱动程序是2.2.0的。

我在有关 ADT 的文档中举了一个例子:

sealed class Tree
case class Branch(b1: Tree, b2: Tree, value: Int) extends Tree
case class Leaf(value: Int) extends Tree
val codecRegistry = fromRegistries( fromProviders(classOf[Tree]), DEFAULT_CODEC_REGISTRY )

此代码未编译。

No known subclasses of the sealed class
[error]     val codecRegistry = fromRegistries( fromProviders(classOf[Tree]), DEFAULT_CODEC_REGISTRY )
[error]                                                              ^
[error] knownDirectSubclasses of Tree observed before subclass Branch registered
[error] knownDirectSubclasses of Tree observed before subclass Leaf registered

我错过了什么吗?

更新

下面是一个完整的例子,说明我要做的事情。

build.sbt

name := "mongodb-driver-test"
version := "1.0"
scalaVersion := "2.11.11"
libraryDependencies += "org.mongodb.scala" %% "mongo-scala-driver" % "2.2.0"

文件Models.scala

import org.mongodb.scala.bson.codecs.{DEFAULT_CODEC_REGISTRY, Macros}
import org.bson.codecs.configuration.CodecRegistries.{fromProviders, fromRegistries}
/**
  * Created by alifirat on 02/01/18.
  */

object Models {
  sealed class Tree
  case class Branch(b1: Tree, b2: Tree, value: Int) extends Tree
  case class Leaf(value: Int) extends Tree
  val treeCodec = Macros.createCodecProvider[Tree]()
  val treeCodecRegistry = fromRegistries( fromProviders(treeCodec), DEFAULT_CODEC_REGISTRY )
}

然后,只需执行:

sbt compile

您将获得:

[error]   val treeCodec = Macros.createCodecProvider[Tree]()
[error]                                                   ^
[error] knownDirectSubclasses of Tree observed before subclass Branch registered
[error] knownDirectSubclasses of Tree observed before subclass Leaf registered
[error] three errors found
[error] (compile:compileIncremental) Compilation failed

如果我将 scala 版本更改为 2.12.0 ,我在编译时没有任何错误......

我使用的是驱动程序版本 2.6.0 和 Scala 版本 2.12.8,但仍然遇到同样的问题。

我的解决方法是删除该密封类前面的关键字 sealed,编译,将其放回原处,然后再次编译。但这非常麻烦。

最新更新