在同一个文件中使用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?
抱歉,我的问题有点像新手。
谢谢你的解释
1条答案
按热度按时间szqfcxe21#
是的,正如评论者所建议的,doobie.util确实包含一个名为“io”的对象,它是doobie特有的。
导入它之后,你的命名空间中就有了“io”这个名字。命名空间是一种管理事物的 * 唯一 * 名称的方式,这样编译器就可以通过名称找到它们,所以根据定义,首先在wins中。
但是,“io”是一个非常常见的名称。一般来说,导入的顺序可能会有所不同,因为先入先得的行为。
如果你意识到你试图从多个包含相同名称的源导入,一个简单的解决方案是首先从具有你想要使用的名称示例的源导入。所以如果你不需要doobie.util.io,你可以把Circe导入放在第一位。
一个更通用的解决方案,如果你想使用doobie.util.io和Circe,也可以使用导入别名来消除命名冲突,从而防止名称“io”的“阴影”,例如在Scala 2中:
字符串
另一种可能性是只导入您实际需要的doobie.util的特定部分,假设不包括“io”。