scala 为什么在Circe之前导入Doobie会引发编译错误?

fdbelqdn  于 6个月前  发布在  Scala
关注(0)|答案(1)|浏览(76)

在同一个文件中使用Doobie和Circe时有了一个发现。这不是我第一次使用这两个库,但从来没有真正注意过它们导入的顺序。
Scala、Doobie和Circe版本。

val scalaVersion = "2.13.12"
val DoobieVersion = "1.0.0-RC1"
val CirceVersion = "0.14.5"

字符串
以下导入将因circe而失败。

import doobie.util._
import io.circe._ // cannot resolve symbol circe


以下的导入是可以的。

import io.circe._
import doobie.util._

**请问这背后的原因是什么?**由于某些原因,有人可能会决定先导入Doobie,然后在同一个文件中导入Circe,并想知道为什么编译器会大喊大叫。

但是,执行以下操作有助于编译器正确导入。

import doobie.util._
import _root_.io.circe._


编译器是否从util中看到io包并尝试从中获取circe
抱歉,我的问题有点像新手。
谢谢你的解释

szqfcxe2

szqfcxe21#

是的,正如评论者所建议的,doobie.util确实包含一个名为“io”的对象,它是doobie特有的。
导入它之后,你的命名空间中就有了“io”这个名字。命名空间是一种管理事物的 * 唯一 * 名称的方式,这样编译器就可以通过名称找到它们,所以根据定义,首先在wins中。
但是,“io”是一个非常常见的名称。一般来说,导入的顺序可能会有所不同,因为先入先得的行为。
如果你意识到你试图从多个包含相同名称的源导入,一个简单的解决方案是首先从具有你想要使用的名称示例的源导入。所以如果你不需要doobie.util.io,你可以把Circe导入放在第一位。
一个更通用的解决方案,如果你想使用doobie.util.io和Circe,也可以使用导入别名来消除命名冲突,从而防止名称“io”的“阴影”,例如在Scala 2中:

import doobie.util.{io => doobieIo}

字符串
另一种可能性是只导入您实际需要的doobie.util的特定部分,假设不包括“io”。

相关问题